Java的网络编程主要涉及的内容是Socket编程,那么什么是Socket编程呢?
Socket,套接字,就是连接两台主机间双向通信的端点。一个Socket由一个IP地址和一个端口号唯一确定
TCP/IP协议是传输层协议,主要解决数据如何在网络中传输;在Java环境中,Socket编程主要是基于TCP/IP协议的网络编程
使用Socket进行网络通信的过程
服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接请求。
客户端:客户端程序根据你服务器所在的主机名和端口号发出连接请求。
两者之间的通信是通过Socket完成的,我们可以认为Socket是两个城市之间的交通工具,有了它,就可以在两个城市之间穿梭了。
- 服务器实例化一个 ServerSocket 对象,表示通过服务器上的端口通信。
- 服务器调用 ServerSocket 类的 accept() 方法,该方法将一直等待,直到客户端连接到服务器上给定的端口。
- 服务器正在等待时,一个客户端实例化一个 Socket 对象,指定服务器名称和端口号来请求连接。
- Socket 类的构造函数试图将客户端连接到指定的服务器和端口号。如果通信被建立,则在客户端创建一个 Socket 对象能够与服务器进行通信。
- 在服务器端,accept() 方法返回服务器上一个新的 socket 引用,该 socket 连接到客户端的 socket。
连接建立后,通过使用 I/O 流在进行通信,每一个socket都有一个输出流和一个输入流,客户端的输出流连接到服务器端的输入流,而客户端的输入流连接到服务器端的输出流。
实现单线程聊天室
客户端
public class SingleClient {
public static void main(String[] args) {
//1.客户端和服务端建立连接
String host="127.0.0.1";//主机IP地址
int port =8086; //主机端口号
try {
//根据主机IP地址和端口号向服务器发出连接请求
Socket socket =new Socket(host,port);
//2.数据传输
//2.1读取服务器数据
InputStream in =socket.getInputStream();
Scanner scanner =new Scanner(in);
String message=scanner.nextLine();
System.out.println("来自服务端:"+message);
//2.2向服务器写数据
OutputStream out=socket.getOutputStream();
PrintStream printStream=new PrintStream(out);
printStream.println("你好,我是客户端");
printStream.flush();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
public class SingleServer {
public static void main(String[] args) {
//1.实例化ServerSocket对象
try {
ServerSocket serverSocket=new ServerSocket(8086);
System.out.println("服务器启动"+serverSocket.getLocalSocketAddress());
//返回socket连接的地址和端口号
while(true){
//2.等待接收客户端连接
final Socket socket =serverSocket.accept();
//返回此socket连接到的主机地址和端口号
System.out.println("有新的客户端连接:"+socket.getInetAddress()+":"+socket.getPort());
//3.数据传输
//3.1向客户端写数据
OutputStream out=socket.getOutputStream();
PrintStream printStream=new PrintStream(out);
printStream.println("client,欢迎你来访问我");
printStream.flush();
//3.2读客户端数据
InputStream in=socket.getInputStream();
Scanner scanner =new Scanner(in);
String message=scanner.nextLine();
System.out.println("来自客户端:"+message);
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}