Socket编程,会将两个通信进程分为客户端和服务器端。一对一聊天软件的客户端和服务器端可任意指定。
Socket编程的服务器端提供ServerSocket类,客户端提供Socket类。服务端的ServerSocket指定绑定的端口,客户端的Socket需要指定ServerSocket的IP和端口进行创建。
服务器端使用无限循环,当接收到客户端的连接时,也生成一个Sokcet对象,这样Server端的Socket对象和客户端的Socket对象就可以通信。
所谓通信对任何一方来说都是发送消息和接受消息,而发送和接受就是使用IO流中的输出流和输入流。
具体看代码和注释:
package com.alan;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Server {
ServerSocket serverSocket;
Socket socket;
BufferedReader reader;
BufferedWriter writer;
Scanner sc = new Scanner(System.in);
public Server() {
try {
//创建ServerSocket,设置端口号为6666
serverSocket = new ServerSocket(6666);
//当接收到客户端的网络连接请求后,生成一个socket对象,供服务端对客户端通信用
socket = serverSocket.accept();
//通过socket对象生成输入流和输出流,这里为了方便和效率,使用了字符流和缓冲流进行了包装
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//无线循环,进行聊天交互
while (true) {
System.out.println("你:");
//获取客户端发送的一行文字(以\n结尾)
String mes = reader.readLine();
System.out.println(mes);
System.out.println("我:");
//控制台输入要发送的文字
mes = sc.next();
//发送给客户端
writer.write(mes + "\n");
//刷新输出流,发送文字
writer.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Server();
}
}
客户端代码:
package com.alan;
import java.io.*;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.Scanner;
public class Client {
Socket socket;
BufferedWriter writer;
BufferedReader reader;
Scanner sc = new Scanner(System.in);
public Client() {
try {
//1.创建Socket对象,用于连接服务器,所以要指定服务器端的ip地址和端口号,而客户端油系统自动分配端口
socket = new Socket("127.0.0.1", 6666);
//也可以给客户端的Socket手动绑定一个端口
// socket = new Socket();
// socket.bind(new InetSocketAddress(8083));
// socket.connect(new InetSocketAddress("127.0.0.1", 6666));
//通过socket对象生成输入流和输出流,这里为了方便和效率,使用了字符流和缓冲流进行了包装
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer = new BufferedWriter (new OutputStreamWriter(socket.getOutputStream()));
//无线循环,进行聊天交互,和服务端的Socket是相同的一个逻辑
while (true) {
System.out.println("我:");
String mes = sc.next();
writer.write(mes + "\n");
writer.flush();
System.out.println("你:");
mes = reader.readLine();
System.out.println(mes);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Client();
}
}
版权声明:本文为GodBlessYouAndMe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。