文档章节

【JAVA】Java Sockets编程

王选易
 王选易
发布于 2013/05/27 22:36
字数 701
阅读 603
收藏 6

#Java Sockets编程

TCP提供了一个可靠的,点对点的客户端-服务器应用通道,想要在TCP上进行传输,客户端程序与服务器程序需要建立彼此的连接。客户端和服务器都是对与连接绑定的socket进行读和写来传输数据。


##What is a Socket?

客户端请求数据的过程:

在此输入图片描述

服务器listen到之后,accept这个请求并与client进行连接

在此输入图片描述

  • 定义:socket是一个互联网上双向连接中的一个端点(An endpoint)。 java.net包提供了两个class:Socket、ServerSocket,分别实现了客户端与服务器端的连接。

端点(An endpoint)是IP地址与端口号的结合。每个TCP连接都有他的两个端点唯一确定

另外,如果你想连接Web,URL class和相关类(URLConnection,URLEncoder)可能比sokect更加合适,实际上,URLs 是对Web的一种相对高层的连接,sockets则作为底层实现


##Reading from and writing to a Socket

package demo;

import java.io.*;
import java.net.*;

public class EchoClient {

public static void main(String args[]) throws IOException {
	
	Socket echoSocket = null;
	PrintWriter out = null;
	BufferedReader in = null;
	
	try{
		echoSocket = new Socket("taranis", 7);
		//write to the socket
		out = new PrintWriter(echoSocket.getOutputStream(), true);
		//read the socket
		in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
		
	}catch (UnknownHostException e){
		System.err.println("Don't know about host");
		System.exit(1);
	}catch (IOException e){
		System.err.println("couldn't get I/O for the connection to taranis");
		System.exit(1);
	}
	
	BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
	String userInput;
	
	while((userInput = stdIn.readLine())!= null) {
		out.println(userInput);
		System.out.println("echo : " + in.readLine());
	}
	
	out.close();
	in.close();
	stdIn.close();
	echoSocket.close();
	}
}

在应用中,应遵守如下顺序:

  1. Open a socket.
  2. Open an input stream and output stream to the socket.
  3. Read from and write to the stream 4. according to the server's protocol.
  4. Close the streams.
  5. Close the socket.

##Writing the Server Side of a Socket

###The Knock Knock Server

Socket clientSocket = null;
	try {
		clientSocket = serverSocket.accept();
	} 
	catch (IOException e) {
		System.out.println("Accept failed: 4444");
		System.exit(-1);
	}	

accept方法一直到客户端启动并向服务器发出请求为止一直在等待。但注意,此方法不支持多个客户端同时访问

KnockKnockProtocol kkp = new KnockKnockProtocol();

outputLine = kkp.processInput(null);
out.println(outputLine);

while ((inputLine = in.readLine()) != null) {
     outputLine = kkp.processInput(inputLine);
     out.println(outputLine);
     if (outputLine.equals("Bye."))
        break;
}

这段代码:

  1. 得到socket的inputstream&outputstream,在stream上打开reader和writer
  2. 通过向socket写操作来初始化传输
  3. 与客户端进行读和写

readLine方法一直等到客户端对socket的outputstream写入(对服务器socket的inputstream的写入)才运行

###The Knock Knock Protocol

所有的服务器/客户端对必须有他们用于对话某种协议,否则,来回传送的数据就变得没有意义了。协议取决于你要完成什么任务

###Supporting Multiple Clients

多用户请求实际上可以从一个port进入,客户端的请求在服务器端排成队列。所以服务器必须按顺序解决他们。通过多线程来解决问题

如下:

while (true) {
	accept a connection;
	create a thread to deal with the client;
}

© 著作权归作者所有

共有 人打赏支持
王选易
粉丝 87
博文 20
码字总数 20066
作品 3
南京
程序员
【JAVA】利用java-RMI进行大文件传输

点击进入我的新博客 利用java-RMI进行大文件传输 为什么要用RMI 在这次的项目中,对于客户端与服务器之间的通信,想了许多办法,由于做的是富客户端应用,最终将技术选定在了RMI和Java-sock...

王选易
2013/05/28
0
19
Java并发教程-1进程和线程

http://www.iteye.com/magazines/131 计算机的使用者一直以为他们的计算机可以同时做很多事情。他们认为当其他的应用程序在下载文件,管理打印队列或者缓冲音频的时候他们可以继续在文字处理...

noday
2014/04/25
0
0
一句话讲清楚什么是JavaEE

Java技术不仅是一门编程语言而且是一个平台。同时Java语言是一门有着特定语法和风格的高级的面向对象的语言,Java平台是Java语言编写的特定应用程序运行的环境。Java平台有很多种,很多的Jav...

qq58edeba279279
06/26
0
0
一句话讲清楚什么是JavaEE

摘要: Java技术不仅是一门编程语言而且是一个平台。同时Java语言是一门有着特定语法和风格的高级的面向对象的语言,Java平台是Java语言编写的特定应用程序运行的环境。Java平台有很多种,很多...

qq592fbb5b34ad7
07/02
0
0
java连接各种数据库(mysql,sql server,oracle,db2)

MYSQL: private String conUrl ="jdbc:mysql://localhost:3306/数据库"网站推广 Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(conUrl,"用户名","密码"); S......

网络营销
2012/01/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ajax 提交返回map集合 获取不到值

后台java代码 @RequestMapping("/cameraList") @ResponseBody public Map<String, Object> cameraListForPage(@RequestParam(defaultValue = "1", value = "page") Integer page......

S三少S
6分钟前
0
0
TypeScrip最污的技术课-技术胖TypeScript图文视频教程

近日Node.js之父瑞安达尔(Ryan Dahl)发布新的开源项目 deno,从官方介绍来看,可以认为它是下一代 Node,使用 rust 语言代替 C++ 重新编写跨平台底层内核驱动,上层仍然使用 V8 引擎,最终...

JamesView
8分钟前
5
0
Es学习笔记

1.过滤排重聚合查询 筛选出某一个聚合值的个数统计。相当于mysql的distinct. 关键字:cardinality "aggs": { "2":{ "cardinality": { "field": "field" } ...

Gmupload
11分钟前
0
0
h5语义化标签

语义化HTML:用最恰当的HTML元素标签做恰当的事情。 优点: 提升可访问性; SEO; 结构清晰,利于维护; 通用容器:div——块级通用容器;span——短语内容无语义容器。 <title></title>:简...

莫西摩西
17分钟前
0
0
修改11g rac中 asm diskstring的发现路径

问题 : 如果我 们asm_disking以前是/dev/oracleasm/disks/* ,并且现在已经有磁盘组再用这个磁盘串了,那么,我们无法直接修改这个发现串为 ORCL:*,修改会报错,提示存在的磁盘无法使用新的...

tututu_jiang
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部