一个客户端,一个服务端,客户端可以发消息到服务端
客户端代码client:
package com.lw.socket.client;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
public static final String IP = "localhost";// 服务器地址
public static final int PORT = 8000;// 服务器端口号
public static void main(String[] args) {
Client client = new Client();
client.handler();
}
private void handler() {
try {
// 实例化一个Socket,并指定服务器地址和端口
Socket client = new Socket(IP, PORT);
// 开启两个线程,一个负责读,一个负责写
new Thread(new ClientReadThread(client)).start();
new Thread(new ClientWriteThread(client)).start();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 处理读操作的线程
*/
class ClientReadThread implements Runnable {
private Socket client;
public ClientReadThread(Socket client) {
this.client = client;
}
@Override
public void run() {
DataInputStream dis = null;
try {
while (true) {
// 读取客户端数据
dis = new DataInputStream(client.getInputStream());
String reciver = dis.readUTF();
System.out.println("服务器端返回过来的是:" + reciver);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dis != null) {
dis.close();
}
if (client != null) {
client = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 处理写操作的线程
*/
class ClientWriteThread implements Runnable {
private Socket client;
public ClientWriteThread(Socket client) {
this.client = client;
}
@Override
public void run() {
DataOutputStream dos = null;
BufferedReader br = null;
try {
while (true) {
// 向客户端回复信息
dos = new DataOutputStream(client.getOutputStream());
System.out.print("客户端请输入:\r");
// 键盘录入
br = new BufferedReader(new InputStreamReader(System.in));
String send = br.readLine();
// 发送数据
dos.writeUTF(send);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dos != null) {
dos.close();
}
if (br != null) {
br.close();
}
if (client != null) {
client = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端代码server:
package com.lw.socket.server;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static final int PORT = 8000;// 监听的端口号
public static void main(String[] args) {
Server server = new Server();
server.init();
}
public void init() {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(PORT);
System.out.println("启动服务器....");
int count = 0;
while (true) {
count++;
Socket client = serverSocket.accept(); // 等待客户端链接
System.out.println("客户端:"+InetAddress.getLocalHost()+"已连接到服务器" + ",连接数量:" + count);
// 一个客户端连接就开户两个线程处理读写
new Thread(new ServerReadThread(client)).start();
new Thread(new ServerWriteThread(client)).start();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (serverSocket != null) {
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 处理读操作的线程
*/
class ServerReadThread implements Runnable {
private Socket client;
public ServerReadThread(Socket client) {
this.client = client;
}
@Override
public void run() {
DataInputStream dis = null;
try {
while (true) {
// 读取客户端数据
dis = new DataInputStream(client.getInputStream());
String reciver = dis.readUTF();
System.out.println("客户端发过来的内容:" + reciver);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dis != null) {
dis.close();
}
if (client != null) {
client = null;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 处理写操作的线程
*/
class ServerWriteThread implements Runnable {
private Socket client;
public ServerWriteThread(Socket client) {
this.client = client;
}
@Override
public void run() {
DataOutputStream dos = null;
BufferedReader br = null;
try {
while (true) {
dos = new DataOutputStream(client.getOutputStream()); // 向客户端回复信息
System.out.print("服务端请输入:\r");
br = new BufferedReader(new InputStreamReader(System.in)); // 键盘录入
String send = br.readLine();
dos.writeUTF(send); // 发送数据
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dos != null) {
dos.close();
}
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}