前言
今天跟大家分享网络编程相关的知识,很简单,可以用来练练手,如果认真看的话依旧会有收获,谢谢大家,感谢大家的阅读
原理
通过socket套接字实现A(客户端)和B(服务器),A可以发送信息给服务器,服务器接收信息,并返回相应的指示
概述:
环境:IntelliJ IDEA 2019.3.4
语言:Java
特点:简单,易懂,效果爆炸
展示
客户端输入bye则退出
代码(具体实现)
客户端
定义客户端类,添加main函数
创建socket,并连接到端口号为2000的本地服务器进程
打印客户端和服务器信息
结果需要等待客户端连接上服务器以后才能显示
私有方法,处理客户端的发送信息和接收信息,完整代码在文章末尾贴
客户端开启结果(需先开启服务器,否在3秒延迟过后会报异常退出)
服务器
定义服务器类,添加main函数
创建serversocket
等待客户端连接,并将连接的客户端加入子线程,开启子线程
服务器开启结果
总结
今天跟大家分享网络编程相关的知识,很简单,可以用来练练手,如果认真看的话依旧会有收获,谢谢大家,感谢大家的阅读
完整代码
客户端
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket();
socket.setSoTimeout(3000);
socket.connect(new InetSocketAddress(InetAddress.getLocalHost(),2000),3000);
System.out.println("已发送服务器连接");
System.out.println("客户端:"+socket.getLocalAddress()+" P:"+socket.getLocalPort());
System.out.println("服务端:"+socket.getInetAddress()+" P:"+socket.getPort());
try {
todo(socket);//信息处理
}catch (Exception e){
System.out.println("异常退出");
}
}
//客户端发送信息,接收服务器回送的信息
private static void todo(Socket socket) throws IOException{
boolean flag = true;//控制接收信息
//获取键盘输入流
InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));
//获取socket输出流
OutputStream os = socket.getOutputStream();
PrintStream ps = new PrintStream(os);
//获取socket输入流
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
do {
//读取键盘的一行数据
String str = input.readLine();
//发送给服务器
ps.println(str);
//读取服务器回送的数据
String echo = br.readLine();
if ("bye".equalsIgnoreCase(echo)){
flag = false;
}else {
System.out.println(echo);
}
}while (flag);
//资源释放
ps.close();
br.close();
System.out.println("客户端已断开连接");
}
}
服务器
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(2000);
System.out.println("服务器:"+server.getLocalSocketAddress());
System.out.println("准备就绪");
//等待客户端连接
for (;;){
Socket socket = server.accept();//获取连接的客户端
ClientHandler handler = new ClientHandler(socket);//将客户端加入异步线程
handler.start();//开启线程
}
}
/**
* 自定义内部类,异步处理客户端发送的信息
* */
private static class ClientHandler extends Thread{
private Socket socket;
private boolean flag = true;
ClientHandler(Socket socket){
this.socket = socket;
}
@Override
public void run() {
super.run();
System.out.println("客户端:"+socket.getInetAddress()+" P:"+socket.getPort());
System.out.println("客户端已连接");
try {
//获取键盘输入流
InputStream in = System.in;
BufferedReader input = new BufferedReader(new InputStreamReader(in));
//获取socket输出流
PrintStream ps = new PrintStream(socket.getOutputStream());
//获取socket输入流
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
do {
//从客户端读取一条数据
String echo = br.readLine();
if ("bye".equalsIgnoreCase(echo)) {
ps.println(echo);
flag = false;
}else {
ps.println("回送:" + echo.length());
}
}while (flag);
}catch (Exception e){
System.out.println("异常退出");
}
finally {
try {
//释放资源
socket.close();
}
catch (IOException e){
e.printStackTrace();
}
}
System.out.println("客户端已断开连接");
}
}
}