基于TCP协议写的使用Socket +多线程实现一个简单的聊天工具
需求: 1.要求客户端和服务端能够交替发送消息
2、在客户端和服务端都能看到彼此的聊天记录
服务端
package com.gosang;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @Author: gosang
* @DateTime: 2020/5/16 23:25
* @Description: TODO
*/
public class Server {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
//设置端口号,服务器IP地址默认是本机的。172.0.0.1=localhost
try {
//读
serverSocket = new ServerSocket(8080);
System.out.println("服务端启动:");
//让服务器一直保持工作状态,即接收socket。
while (true){
//serverSocket.accept()是阻塞方法,拿到客户端发来的socket之前都不会继续往下走
socket = serverSocket.accept();
//accept一个socket就新建一个线程
new Thread(new SocketRunable(socket)).start();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
新建线程
package com.gosang;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* @Author: gosang
* @DateTime: 2020/5/16 23:56
* @Description: TODO
*/
public class SocketRunable implements Runnable{
private Socket socket;
public SocketRunable(Socket socket){
this.socket = socket;
}
@Override
public void run() {
InputStream inputStream = null;
OutputStream outputStream = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
String message = null;
Scanner scanner = new Scanner(System.in);
try {
//让socket一直保持工作状态不然读写一次结束了服务自己就停止了
while(true){
//读
System.out.println("客户端:");
inputStream = socket.getInputStream();
//通过数据流处理输入流。因为可以直接用UTF-8的形式直接拿到
dataInputStream = new DataInputStream(inputStream);
message = dataInputStream.readUTF();
System.out.println(message);
// 写
System.out.println("服务端:");
message = scanner.next();
outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(message);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
客户端
package com.gosang;
import java.io.*;
import java.net.Socket;
import java.util.Scanner;
/**
* @Author: gosang
* @DateTime: 2020/5/16 23:41
* @Description: TODO
*/
public class Client {
public static void main(String[] args) {
InputStream inputStream = null;
OutputStream outputStream = null;
DataInputStream dataInputStream = null;
DataOutputStream dataOutputStream = null;
Scanner scanner = new Scanner(System.in);
String message = null;
Socket socket = null;
try {
//让socket一直保持工作状态不然读写一次结束了服务自己就停止了
while(true){
//设置此socket要访问的服务器的ip+端口
socket = new Socket("127.0.0.1",8080);
//写
System.out.println("客户端:");
message = scanner.next();
outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
dataOutputStream.writeUTF(message);
//读
System.out.println("服务端:");
inputStream = socket.getInputStream();
dataInputStream = new DataInputStream(inputStream);
message = dataInputStream.readUTF();
System.out.println(message);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}