网络上两个程序通过一个双向的通信连续实现数据的交换,这个双向链路的一端成为一个Socket。Socket也称套接字。
在Java语言中,Socket可以分为两种类型:
- TCP(传输控制协议):面向连接的Socket通信协议。
- UDP(用户数据报协议):面向无连接的Socket通信协议。
任何一个Socket都是由IP地址和端口号唯一确定的。
基于TCP的通信过程简述:
- Server端监听指定某个端口(建议使用大于1024的端口)是否有连接请求。
- Client端向Server端发出Connect连接请求。
- Server端向Client端返回Accept接受消息。
- 会话建立。
- Server端和Client端可以通过Send、Write等方法与对方通信。
举个栗子:用Socket实现客户端和服务端的通信,要求客户端发送数据后能够回显相同的数据。
服务端:Server.java
package com.server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) {
BufferedReader br = null;
PrintWriter pw = null;
try {
ServerSocket server = new ServerSocket(2000);
Socket socket = server.accept();
//获取输入流
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//获取输出流
pw = new PrintWriter(socket.getOutputStream(),true);
//获取接收的数据
String s = br.readLine();
//发送相同的数据给客户端
pw.println(s);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
br.close();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
客户端:Client.java
package com.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
BufferedReader br = null;
PrintWriter pw = null;
try {
Socket socket = new Socket("localhost",2000);
//获取输入流和输出流
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream(),true);
//向服务端发送数据
pw.println("hello Socket");
String s = null;
while (true) {
s= br.readLine();
if (s != null) {
break;
}
}
System.out.println(s);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
br.close();
pw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
先启动服务端程序,然后再运行客户端程序,客户端会把从服务端转发过来的数据打印出来。