客户端1
发送消息给服务端并接收回复(运行程序时先运行服务端,再运行客户端)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
//客户端
public class MyClient {
public static void main(String[] args) {
client();
}
public static void client() {
//通讯链路的一端是ServerSocket
try {
Socket socket = new Socket("localhost",5000);//(ip,端口号)
String info = "1说最近好忙,没有出门";
//输出流帮我发送信息
OutputStream os = socket.getOutputStream();
//字符串转化为字节,然后通过输出流写出去
os.write(info.getBytes());
socket.shutdownOutput();
//接受回复信息
//通过输入流获得信息
InputStream in = socket.getInputStream();
//把字节转化为字符,把字符读成字符串输出
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String reply;
while ((reply=reader.readLine())!=null) {
System.out.println(reply);
}
//释放资源
reader.close();
in.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端2
同客户端1一样,同时发送信息给服务端,接收回复
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
//客户端2
public class MyClient2 {
public static void main(String[] args) {
client();
}
public static void client() {
//通讯链路的一端是ServerSocket
try {
Socket socket = new Socket("localhost",5000);
String info = "2说三生三世十里桃花";
//输出流帮我发送信息
OutputStream os = socket.getOutputStream();
//字符串转化为字节,然后通过输出流写出去
os.write(info.getBytes());
socket.shutdownOutput();
//接受回复信息
//通过输入流获得信息
InputStream in = socket.getInputStream();
//把字节转化为字符,把字符读成字符串输出
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String reply;
while ((reply=reader.readLine())!=null) {
System.out.println(reply);
}
//释放资源
reader.close();
in.close();
os.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
死循环无限监听socket信息,每监听到一个socket就启动一个线程
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
//服务端
public interface MyServer {
public static void main(String[] args) {
server();
}
public static void server() {
//通讯链路的一端是ServerSocket
try {
ServerSocket serverSocket = new ServerSocket(5000);
//接受客户端发送过来的信息
while (true) {
//服务器端Socket要监听到客户端的Socket
Socket socker = serverSocket.accept();
//每监听到一个Socktet,就启动一个线程来处理请求
ChatThread chatThread = new ChatThread(socker);
chatThread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
线程类
调用线程类回复给两个客户端信息
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
//1.线程类的特殊性:功能主体run() 调用时start()
public class ChatThread extends Thread{
Socket socket = null;
//构造器,构造方法,它会在别人new我的时候调用
public ChatThread(Socket socker) {
this.socket = socker;
}
//接受客户端请求并对请求做一个处理和响应
public void run() {
try {
//通过输入流获得信息
InputStream in = socket.getInputStream();
//把字节转化为字符,把字符读成字符串输出
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String info;
while ((info=reader.readLine())!=null) {
System.out.println(info);
}
//显示客户端的ip
InetAddress ia = socket.getInetAddress();
String ip = ia.getHostAddress();
System.out.println("该客户端的ip是:"+ip);
//给客户端一个回复
String repaly = "疫情期间不出";
//输出流帮我把信息发送给对方
OutputStream os = socket.getOutputStream();
//字符串转化为字节,然后通过输出流写出去
os.write(repaly.getBytes());
//
os.close();
reader.close();
in.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果
客户端收到的消息
服务端收到的消息