Socket是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。
Socket 保证了不同计算机之间的通信,也就是网络通信。
下面我们使用Socket来模拟一个小的聊天工具。
首先需要一个服务器端,也就是接收消息的一端。
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class SocketServer {
public static void main(String[] args){
try{
//1.创建ServerSocket对象,指定端口号为5000
ServerSocket serverSocket = new ServerSocket(5000);
//2.使用accept()方法监听客户端,与客户端建立连接,获取客户端的socket对象
Socket socket = serverSocket.accept();
//3.获取客户端发来的消息流(获取用户请求信息)
InputStream is = socket.getInputStream();
//4.使用带有缓冲区的BufferedReader读取消息流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//5.读取客户端发来的信息
String msg = null;
while((msg = br.readLine())!=null){
System.out.println("来自客户端的消息:"+msg);
}
//6.关闭各种资源
br.close();
is.close();
socket.close();
serverSocket.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
创建客户端,用于发送消息
import java.io.*;
import java.net.Socket;
//客户端
public class SocketClient{
public static void main(String[] args) {
try {
//1.创建客户端Socket对象,传入服务器端的ip和端口号
Socket socket = new Socket("localhost",5000);
//2.创建输出流对象
OutputStream os = socket.getOutputStream();
//3.通过输出流将信息发送请求给服务器
String loginInfo = "你好,我是李焕英";
os.write(loginInfo.getBytes());
//4.关闭流及Socket对象
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
启动服务:
先启动服务器端,再启动客户端,会在服务器端的控制台输出“来自客户端的消息:你好,我是李焕英”。通信完毕。

需求升级:
由于要模拟聊天工具,需要服务器端不断地监听客户端(使用循环),客户端需要手动输入信息进行发送(使用Scanner)。
服务器端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
//服务器端
public class SocketServer {
public static void main(String[] args) {
try {
//1、创建服务器端serversocket对象,指定端口号
ServerSocket serverSocket = new ServerSocket(5000);
Socket socket = null;
InputStream inputStream = null;
BufferedReader bfr = null;
while (true){
//2、使用accept()方法监听客户端的请求,建立连接,返回监听到的客户端的Socket对象
socket= serverSocket.accept();
//3.创建输入流,接收客户端的信息
inputStream = socket.getInputStream();
//4.使用BufferedReader读取客户端的信息
bfr = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while((line = bfr.readLine())!=null){
System.out.println("来自客户端的消息:"+line);
}
}
/*//5.关闭流和socket连接
bfr.close();
inputStream.close();
socket.close();
serverSocket.close();*/
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端:
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
boolean flag = true;
while (flag){
//创建socket对象
Socket socket = new Socket("localhost",5000);
//输出流
OutputStream os = socket.getOutputStream();
System.out.println("请输入要发送的信息:(按0退出)");
String info = sc.next();
if(!"0".equals(info)){
os.write(info.getBytes());
}else {
flag = false;
}
os.close();
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果:
客户端发送消息:

服务器端接受消息:

思考下,如何使用多线程处理多个客户端发送消息的请求?
5558

被折叠的 条评论
为什么被折叠?



