网络套接字编程之TCP实现聊天–Java
客户端:
package 套接字编程.TCP聊天;
import java.io.*;
import java.net.*;
import java.util.Scanner;
/**
* Create with Darcula IDEA
* Description:
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
Scanner scanner = new Scanner(System.in);
//1.创建Socket套接字
Socket socket = new Socket();
//2.将此套接字连接到服务器
InetAddress serverAddress = InetAddress.getLocalHost();
SocketAddress serverSocketAddress = new InetSocketAddress(serverAddress,8888);
socket.connect(serverSocketAddress);
while(true){
//3.获取用户输入
System.out.println("请输出:");
String request = scanner.nextLine();
//4.通过字节流,直接写入请求
OutputStream os = socket.getOutputStream();//在这里,此套接是输出
PrintStream out = new PrintStream(os,true,"UTF-8");
out.println(request);
out.flush();// 清空缓冲区的数据流
//5.通过字节流,直接读取数据
InputStream is = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"UTF-8"));
String response = reader.readLine();
System.out.println(response);
}
}
}
服务端–单线程:
package 套接字编程.TCP聊天;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
/**
* Create with Darcula IDEA
* Description:
*
*/
public class TCPServer {
public static void main(String[] args) throws IOException {
//1.创建ServerSocket套接字
ServerSocket socket = new ServerSocket(8888);//相当于服务器启动了,并且监听了8080端口
Scanner scanner = new Scanner(System.in);
while(true){
Socket clientSocket = socket.accept();//等待客户端连接8080端口
InetAddress clientAddress = clientSocket.getInetAddress();
int clientPort = clientSocket.getPort();
System.out.printf("有客户端连接上来 %s:%d%n",clientAddress.getHostAddress(),clientPort);
//2.获取字节流
InputStream is = clientSocket.getInputStream();
//3.字节流转换为字符流
InputStreamReader isReader = new InputStreamReader(is,"UTF-8");
//4.字符流转换缓冲字符流
BufferedReader reader = new BufferedReader(isReader);
//5.获取输出字节流
OutputStream os = clientSocket.getOutputStream();
PrintStream out = new PrintStream(os,true,"UTF-8");
//6.从缓冲字符流中获取客户端的输出
String line = reader.readLine();
System.out.println("对方说:"+ line);
System.out.println("请回复:");
String response = scanner.nextLine();
out.println(response);
//7.关闭socket
clientSocket.close();
}
}
}
服务端–多线程实现:
package 套接字编程.TCP聊天;
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;
/**
* Create with Darcula IDEA
* Description:
*
*/
public class TCPServerThreads {
private static class TalkRunnable implements Runnable {
private Socket clientSocket;
//构造函数
TalkRunnable(Socket socket) {
this.clientSocket = socket;
}
@Override
public void run() {
try {
InetAddress clientAddress = clientSocket.getInetAddress();
int clientPort = clientSocket.getPort();
System.out.printf("有客户端连接上来 %s:%d%n",clientAddress.getHostAddress(),clientPort);
//2.获取字节流
InputStream is = clientSocket.getInputStream();
//3.字节流转换为字符流
InputStreamReader isReader = new InputStreamReader(is,"UTF-8");
//4.字符流转换缓冲字符流
BufferedReader reader = new BufferedReader(isReader);
//5.获取输出字节流
OutputStream os = clientSocket.getOutputStream();
PrintStream out = new PrintStream(os,true,"UTF-8");
while(true) {
// 6.从缓冲字符流中获取客户端的输出
String line = reader.readLine();
System.out.println("对方说:"+ line);
String response = "我已经收到了,"+ System.currentTimeMillis();
out.println(response);
out.flush();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
ServerSocket socket = new ServerSocket(8888);
BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>();
ExecutorService pool = new ThreadPoolExecutor(
100,
100,
0,
TimeUnit.MILLISECONDS,
queue
);
while(true) {
Socket clientSocket = socket.accept();
pool.execute(new TalkRunnable(clientSocket));
}
}
}