Java学习-Socket编程
什么是Socket
Java中的Socket编程其实就是网络编程,一般使用基于TCP/IP协议的Socket编程。所有关于Socket编程的API都在Java.net包里,一般实现客户端和服务器端之间的通讯。
Socket通讯的过程
Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。
对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:
- 创建Socket;
- 打开连接到Socket的输入/出流;
- 按照一定的协议对Socket进行读/写操作;
- 关闭Socket。
socket编程要求
服务器的位置必须得是固定的,1
ServerSocket server=new ServerSocket(6789);
注:端口号的分配必须是唯一的,因为端口是为了唯一标识每台计算机唯一服务的。另外端口号是从0到65535之间的,前1024个端口已经被TCP/IP作为保留端口,因此你所分配的端口只能是1024个之后的。1
Socket socket = server.accept();
注:accept方法是一个阻塞方法,在服务器端与客户端之间建立联系之前会一直等待阻塞。
在客户端中,用如下代码打开一个socket:1
Socket client = new Socket("127.0.0.1", 8919); //两个参数(host,port)
注:host即客户端需要连接的机器,port就是服务器端用来监听请求的端口。
例子:
我们从客户端的Socket对象中得到OutputStream对象,然后写入数据后。很类似文件IO的处理代码。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class ClientSocket {
public static void main(String args[]) {
String host = "127.0.0.1";
int port = "8919";
try{
Socket client = new Socket(host ,port );
Writer writer = new OutputStreamWriter(client.getOutputStream());
writer.writer("Hello From Client");
writer.flush();
writer.close();
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
在服务器端创建一个Socket,1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class ServerClient {
public static void main(String[] args) {
int port = 8919;
try {
ServerSocket server = new ServerSocket(port);
Socket socket = server.accept();
Reader reader = new InputStreamReader(socket.getInputStream());
char chars[] = new char[1024];
int len;
StringBuilder builder = new StringBuilder();
while ((len=reader.read(chars)) != -1) {
builder.append(new String(chars, 0, len));
}
System.out.println("Receive from client message=: " + builder);
reader.close();
socket.close();
server.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
支持多客户的client/server程序
前面的Client/Server程序只能实现Server和一个客户的对话。在实际应用中,往往是在服务器上运行一个永久的程序,它可以接收来自其他多个客户端的请求,提供相应的服务。为了实现在服务器方给多个客户提供服务的功能,需要对上面的程序进行改造,利用多线程实现多客户机制。服务器总是在指定的端口上监听是否有客户请求,一旦监听到客户请求,服务器就会启动一个专门的服务线程来响应该客户的请求,而服务器本身在启动完线程之后马上又进入监听状态,等待下一个客户的到来。