java Socket和ServerSocket多线程编程
这是在一本java教材上看到的,做了点修改。具体本教材记不清楚了,Sorry.放在这里,只是让自己需要的时候能够容易找到。
程序分两部分,服务端和客户端。先把服务端运行起来,在运行客户端。整个过程就是客户端想服务端发送String,服务端再返回。客户端的String由键盘输入得到。
服务器端。
Java代码
- package net.tcp;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.io.PrintWriter;
- import java.net.ServerSocket;
- import java.net.Socket;
- public class Server extends Thread
- {
- ServerSocket server = null;
- Socket sk = null;
- BufferedReader rdr = null;
- PrintWriter wtr = null;
- public Server()
- {
- try
- {
- server = new ServerSocket(1987);
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- public void run()
- {
- while (true)
- {
- System.out.println("Listenning...");
- try
- {
- // 每个请求交给一个线程去处理
- sk = server.accept();
- ServerThread th = new ServerThread(sk);
- th.start();
- sleep(1000);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- public static void main(String [] args)
- {
- new Server().start();
- }
- class ServerThread extends Thread
- {
- Socket sk = null;
- public ServerThread(Socket sk)
- {
- this.sk = sk;
- }
- public void run()
- {
- try
- {
- wtr = new PrintWriter(sk.getOutputStream());
- rdr = new BufferedReader(new InputStreamReader(sk
- .getInputStream()));
- String line = rdr.readLine();
- System.out.println("从客户端来的信息:" + line);
- // 特别,下面这句得加上 “\n”,
- wtr.println("你好,服务器已经收到您的信息!'" + line + "'\n");
- wtr.flush();
- System.out.println("已经返回给客户端!");
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- }
- }
- }
客户端:
Java代码
- package net.tcp;
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.InputStreamReader;
- import java.io.OutputStreamWriter;
- import java.io.PrintWriter;
- import java.net.Socket;
- public class Client extends Thread
- {
- Socket sk = null;
- BufferedReader reader = null;
- PrintWriter wtr = null;
- BufferedReader keyin = null;
- public Client()
- {
- keyin = new BufferedReader(new InputStreamReader(System.in));
- try
- {
- sk = new Socket("127.0.0.1", 1987);
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public void run()
- {
- try
- {
- reader = new BufferedReader(new InputStreamReader(sk
- .getInputStream()));
- wtr = new PrintWriter(sk.getOutputStream());
- String get = keyin.readLine();
- while (true)
- {
- if (get != null & get.length() > 0)
- {
- wtr.println(get);
- wtr.flush();
- // wtr.close();
- // System.out.println(get + "发送完毕");
- }
- if (reader != null)
- {
- String line = reader.readLine();
- System.out.println("从服务器来的信息:" + line);
- }
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- public static void main(String [] args)
- {
- new Client().start();
- }
- }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示