1 import java.io.IOException;
2 import java.io.InputStream;
3 import java.io.OutputStream;
4 import java.net.Socket;
5 import java.util.Scanner;
6 //客户端要做的事就是 读出服务器端输出的信息,将要说的话写到服务器端
7 public class Client {
8 public static void main(String[] args) {
9 Socket client = null;
10 OutputStream os =null;
11 InputStream is = null;
12 Scanner sc= new Scanner(System.in);
13
14 try {
15 client= new Socket("127.0.0.1",5000);
16 String address = client.getInetAddress().getHostAddress();
17 is = client.getInputStream();
18 int len=0;
19 byte []b = new byte[1024];
20 len=is.read(b, 0, b.length);
21 System.out.println(new String(b,0,len));
22 os = client.getOutputStream();
23 String sendMsg=sc.next();
24 os.write(sendMsg.getBytes());
25 while(true) {
26 len=is.read(b, 0, b.length);
27 String msg = new String(b,0,len);
28 System.out.println(msg);
29 String send = sc.next();
30 os.write(send.getBytes());
31 os.flush();
32 if(send.contains("bye")) //判断写出的字符串中是否包含bye 包含则退出
33 {
34 break;
35 }
36 }
37
38 } catch (Exception e) {
39 e.printStackTrace();
40 }finally {
41 try {
42 is.close();
43 os.close();
44 client.close();
45 } catch (IOException e) {
46 // TODO Auto-generated catch block
47 e.printStackTrace();
48 }
49 }
50 }
51 }

 1 import java.io.IOException;
2 import java.io.InputStream;
3 import java.io.OutputStream;
4 import java.net.ServerSocket;
5 import java.net.Socket;
6 import java.util.Scanner;
7 import java.util.concurrent.ExecutorService;
8 import java.util.concurrent.Executors;
9 //服务器端接收多个客户端的连接 并处理每个连接要做的事情
10 public class Server {
11 public static ServerSocket server;
12 public static Socket client;

//静态代码块只执行一次 跟随类加载
        //非静态匿名代码块 每次都跟随对象加载

13     static {
14 try {
15 server = new ServerSocket(5000);
16 System.out.println("服务器端已经创建,开放端口为5000");
17 } catch (IOException e) {
18 // TODO Auto-generated catch block
19 e.printStackTrace();
20 }
21 }
//使用的线程池是newCachedThreadPool
22 public static void main(String[] args) {
23 ExecutorService exe = Executors.newCachedThreadPool();
24 while(true) {
25 try {
26 client= server.accept();
27 exe.execute(new SocketThread(client));
28
29
30 } catch (IOException e) {
31 // TODO Auto-generated catch block
32 e.printStackTrace();
33 }
34 }
35 }
36
37 }
38 class SocketThread extends Thread {
39 Scanner sc= new Scanner(System.in);
40 private Socket s = null;
41 private InputStream is= null;
42 private OutputStream os= null;
43 public SocketThread(Socket s) {
44 this.s = s ;
45
46 }
47 @Override
48 public void run() {
49 try {
50 os = s.getOutputStream();
51 os.write("你好 请输入你的名字".getBytes());
52 os.flush();
53 is=s.getInputStream();
54 byte []b = new byte[1024];
55 int len=is.read(b, 0, b.length);
56 //为线程设置名字
57 setName(new String (b,0,len));
58 os.write("恭喜设置昵称成功,我们开始聊天吧".getBytes());
59 os.flush();
60 while(true) {
61 len=is.read(b, 0, b.length);
62 String msg = new String(b,0,len);
63 if(msg.contains("bye")) {
64 break;
65 }
66 System.out.println(getName()+":"+msg);
67 String send =sc.next();
68 os.write(send.getBytes());
69 os.flush();
70
71 }
72
73 } catch (Exception e) {
74 // TODO: handle exception
75 }
76 finally {
77 try {
78 os.close();
79 is.close();
80 s.close();
81 } catch (IOException e) {
82 // TODO Auto-generated catch block
83 e.printStackTrace();
84 }
85 }
86 }
87 }

io流+网络+线程池 实现简单的多客户端与服务器端通信的更多相关文章

  1. Executor线程池的简单使用

    我们都知道创建一个线程可以继承Thread类或者实现Runnable接口,实际Thread类就是实现了Runnable接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...

  2. JAVA中线程池的简单使用

    比如现在有10个线程,但每次只想运行3个线程,当这3个线程中的任何一个运行完后,第4个线程接着补上.这种情况可以使用线程池来解决,线程池用起来也相当的简单,不信,你看: package com.dem ...

  3. Java线程池的简单使用

    最近由于公司的业务需求,需要使用线程池来进行对数据进行处理,所以就简单的学习了一下线程池的东西,刚接触感觉挺难的,不过使用了就不感觉那么难了,还是蛮简单的, package com.yd.sms.jo ...

  4. Java集合、IO流、线程知识

    一.集合: 1. 集合框架: 1)Collection (1)List:有序的,有索引,元素可重复. (add(index, element).add(index, Collection).remov ...

  5. QT 线程池 + TCP 小试(一)线程池的简单实现

    *免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 很久以前做过ACE + MFC/QT 的中轻量级线程池应用,大概就 ...

  6. Java 线程池ThreadPoolExecutor简单应用

    什么是线程池: 线程池就是控制线程的一个池子.用来控制线程数量. 为什么要使用线程池: 1.避免系统反复创建和销毁线程影响执行的时间(创建+销毁>>执行时间时) 2.控制线程数量.线程过多 ...

  7. gsoap:实现线程池处理时获取到客户端的ip

    问题: 在使用线程池处理客户端请求时发现不能获取到客户端的ip! 原因:     由于在server_loop注循环中只把连接字sock加到queue队列中,并没有客户端IP,所以每一次queue回调 ...

  8. 线程 IO流 网络编程 基础总结

    线程 进程---->进行中的程序 线程---->由进程创建 一个进程可以创建多个线程 并发:同一个时刻 多个任务交替执行 造成一种貌似同时进行的错觉 简单来说 单个cpu的多任务就是并发 ...

  9. Proxool线程池的简单实现demo

    使用的jar包:ojdbc14.jar    proxool-0.9.0.jar   commons-logging-1.1.3.jar 代码分为两部分: ProxoolTest.java和proxo ...

随机推荐

  1. c++指针 c指针 改变值

    1. #include <iostream>using namespace std;void move(int *p)    ====>void move(*&p){     ...

  2. Flink-v1.12官方网站翻译-P020-Builtin Watermark Generators

    内置水印生成器 正如在Generating Watermarks一文中所描述的,Flink提供了抽象,允许程序员分配自己的时间戳和发射自己的水印.更具体地说,可以通过实现WatermarkGenera ...

  3. 设计模式(三)——Java工厂方法模式

    工厂方法模式 1 看一个新的需求 披萨项目新的需求:客户在点披萨时,可以点不同口味的披萨,比如 北京的奶酪 pizza.北京的胡椒 pizza 或者是伦敦的奶酪 pizza.伦敦的胡椒 pizza. ...

  4. 设计模式(十七)——迭代器模式(ArrayList 集合应用源码分析)

    1 看一个具体的需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系.如图: 2 传统的设计方案(类图) 3 传统的方式的问题分析 ...

  5. C - C(换钱问题)

    换钱问题: 给出n种钱,m个站点,现在有第 s种钱,身上有v 这么多: 下面 m行 站点有a,b两种钱,rab a->b的汇率,cab a-->b的手续费, 相反rba cba :  问在 ...

  6. 1154 Vertex Coloring

    题目前半略 Sample Input: 10 11 8 7 6 8 4 5 8 4 8 1 1 2 1 4 9 8 9 1 1 0 2 4 4 0 1 0 1 4 1 0 1 3 0 0 1 0 1 ...

  7. Codeforces Round #656 (Div. 3) C. Make It Good

    题目链接:https://codeforces.com/contest/1385/problem/C 题意 去除一个数组的最短前缀使得余下的数组每次从首或尾部取元素可以排为非减序. 题解一 当两个大数 ...

  8. Educational Codeforces Round 43

    Educational Codeforces Round 43  A. Minimum Binary Number 显然可以把所有\(1\)合并成一个 注意没有\(1\)的情况 view code / ...

  9. HDU5691 Sitting in Line【状压DP】

    HDU5691 Sitting in Line 题意: 给出\(n\)个数字,有些数字的位置固定了,现在要求把所有没固定的数字放在一个位置,使得任意相邻两个位置的数字的相乘的和最大 题解: \(n\) ...

  10. 2020杭电多校 10C / HDU 6879 - Mine Sweeper (构造)

    HDU 6879 - Mine Sweeper 题意 定义<扫雷>游戏的地图中每个空白格子的值为其周围八个格子内地雷的数量(即游戏内临近地雷数量的提示) 则一张地图的值\(S\)为所有空白 ...