由于SOCKET是对TCP的一种封装,那么即可以实现客户端(Client)与服务端(Server)聊天(C发一行再S发一行,不能多行或者带空格)
数据传输格式:IO流
菜鸟
实现过程:





学习了上面的类创建与方法后,接下来开始搭建服务端,我们在服务端里需要做到的是:
0,设置服务器运行端口号与超时时间
1,创建服务端socket,并返回 accept() 监听客户端
2,连接成功后,等待客户端发送消息
具体介绍看注释,英文注释可以启用,把发送消息的方式改为Buffer而不是IO流
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.Scanner;
public class Server extends Thread {
private ServerSocket serverSocket;//创建 私有化服务器套
Scanner scanner = new Scanner(System.in);
// BufferedWriter writer;
// BufferedReader reader;
public Server(int port) throws IOException {//创建 服务器体 封装
serverSocket = new ServerSocket(port); //引入 带有端口输入的服务器套
serverSocket.setSoTimeout(10000000);//为 带有端口输入的服务器套 设置 超时时间
}
public void run() {
while (true) {
try {
System.out.println("等待客户端连接,其端口号为:" + serverSocket.getLocalPort() + "...");//得到客户端输入的端口号
Socket server_socket = serverSocket.accept();//服务端 得到一个socket
System.out.println("客户端连接的地址:" + server_socket.getRemoteSocketAddress());//得到客户端地址
DataInputStream dataInputStream = new DataInputStream(server_socket.getInputStream());//得到socket的输入流
System.out.println("客户端响应:" + dataInputStream.readUTF());
DataOutputStream dataOutputStream = new DataOutputStream(server_socket.getOutputStream());//得到socket的输出流
dataOutputStream.writeUTF("谢谢连接我!" + server_socket.getLocalSocketAddress());
// reader = new BufferedReader(new InputStreamReader(server_socket.getInputStream()));
// writer = new BufferedWriter(new OutputStreamWriter(server_socket.getOutputStream()));
// new DataOutputStream(server_socket.getOutputStream());
while (true) {//无限循环的发送消息环节
System.out.print("客户端:");
System.out.println(dataInputStream.readUTF());
// String message = reader.readLine();
// System.out.println(message);
System.out.print("服务端:");
String message = scanner.next();
dataOutputStream.writeUTF(message + "\n");
// writer.write(message + "\n");
// writer.flush();
}
} catch (SocketTimeoutException t) {
System.out.println("socket超时了!");
break;
} catch (IOException e) {
e.printStackTrace();
break;
}
}
}
public static void main(String[] args) {
int port = Integer.parseInt(args[0]);//端口号创建
try {
Thread thread = new Server(port);
thread.run();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端的要求:
0,输入连接主机名与端口号
1,创建客户端socket(此时此socket即可与服务端进行交互了)
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) {
String serverName = args[0];
Scanner scanner = new Scanner(System.in);
// BufferedWriter writer;
// BufferedReader reader;
int port = Integer.parseInt(args[1]);
try {
System.out.println("连接到服务器:" + serverName + ",端口号:" + port);
Socket client_socket = new Socket(serverName, port);//创建 客户端socket
System.out.println("远程服务器地址:" + client_socket.getRemoteSocketAddress());
DataOutputStream dataOutputStream = new DataOutputStream(client_socket.getOutputStream());//改装可写数据流的输出流到 服务端
dataOutputStream.writeUTF("你好!我是客户端:" + client_socket.getLocalSocketAddress());//数据流输出一下
DataInputStream dataInputStream = new DataInputStream(client_socket.getInputStream());//改装侦听 服务器发送来的消息
System.out.println("服务器响应:" + dataInputStream.readUTF());
// reader = new BufferedReader(new InputStreamReader(client_socket.getInputStream()));
// writer = new BufferedWriter(new OutputStreamWriter(client_socket.getOutputStream()));
// new DataOutputStream(client_socket.getOutputStream());
while (true) {
System.out.print("客户端:");
String message = scanner.next();
dataOutputStream.writeUTF(message + "\n");
// writer.write(message + "\n");
// writer.flush();
System.out.print("服务器:");
System.out.println(dataInputStream.readUTF());
// message = reader.readLine();
// System.out.println(message);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
启动方式:
1,先给两个文件编译成字节码文件 服务端:javac -encoding utf-8 Server客户端:javac -encoding utf-8 Client
2,在服务端的目录下,服务端先启动,java Server.java 8080
3,在客户端的目录下,客户端启动,java Client.java localhost 8080