io流+网络+线程池 实现简单的多客户端与服务器端通信
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流+网络+线程池 实现简单的多客户端与服务器端通信的更多相关文章
- Executor线程池的简单使用
我们都知道创建一个线程可以继承Thread类或者实现Runnable接口,实际Thread类就是实现了Runnable接口. 到今天才明白后端线程的作用:我们可以开启线程去执行一些比较耗时的操作,类似 ...
- JAVA中线程池的简单使用
比如现在有10个线程,但每次只想运行3个线程,当这3个线程中的任何一个运行完后,第4个线程接着补上.这种情况可以使用线程池来解决,线程池用起来也相当的简单,不信,你看: package com.dem ...
- Java线程池的简单使用
最近由于公司的业务需求,需要使用线程池来进行对数据进行处理,所以就简单的学习了一下线程池的东西,刚接触感觉挺难的,不过使用了就不感觉那么难了,还是蛮简单的, package com.yd.sms.jo ...
- Java集合、IO流、线程知识
一.集合: 1. 集合框架: 1)Collection (1)List:有序的,有索引,元素可重复. (add(index, element).add(index, Collection).remov ...
- QT 线程池 + TCP 小试(一)线程池的简单实现
*免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 很久以前做过ACE + MFC/QT 的中轻量级线程池应用,大概就 ...
- Java 线程池ThreadPoolExecutor简单应用
什么是线程池: 线程池就是控制线程的一个池子.用来控制线程数量. 为什么要使用线程池: 1.避免系统反复创建和销毁线程影响执行的时间(创建+销毁>>执行时间时) 2.控制线程数量.线程过多 ...
- gsoap:实现线程池处理时获取到客户端的ip
问题: 在使用线程池处理客户端请求时发现不能获取到客户端的ip! 原因: 由于在server_loop注循环中只把连接字sock加到queue队列中,并没有客户端IP,所以每一次queue回调 ...
- 线程 IO流 网络编程 基础总结
线程 进程---->进行中的程序 线程---->由进程创建 一个进程可以创建多个线程 并发:同一个时刻 多个任务交替执行 造成一种貌似同时进行的错觉 简单来说 单个cpu的多任务就是并发 ...
- Proxool线程池的简单实现demo
使用的jar包:ojdbc14.jar proxool-0.9.0.jar commons-logging-1.1.3.jar 代码分为两部分: ProxoolTest.java和proxo ...
随机推荐
- idea中类注释和方法注释的设置
类注释设置 近几年版本的idea在设置类名时从Includes中引用文件,所以只需要在被引用的文件中设置对应注释即可. /** *@className: ${NAME} *@description: ...
- 设计模式(一)——Java单例模式(代码+源码分析)
1)单例模式保证了 系统内存中该类只存在一个对象,节省了系统资源,对于一些需要频繁创建销毁的对象,使用单例模式可以提高系统性能 2)当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不 ...
- sh 脚本名字和./脚本名字有什么区别
sh xxx用 sh 这个shell (sh一般指系统默认shell,比如 bash, ksh, Csh 等都有可能) 来解释和运行 xxx 这个脚本.xxx 文件不必具有可执行属性(chmod +x ...
- CTGU_训练实录
前言 之前做题都没有感觉,慢慢出去比赛后,打Codeforces,看别的人博客,知乎上的讨论,慢慢的对算法有一些自己的思考.特写是最近看知乎上别人说的Dijkstra利用水流去理解,LCA的学习,感觉 ...
- 2019 Multi-University Training Contest 4.Divide the Stones(贪心)
题意:给你n和k (k|n) 有n个数 第i个数权值为i 要你求权值相同且分成k组 且每组的个数为n/k 思路:恶心构造题,首先对于总权值不能分为k份的 显然不能分成 然后 我们把n/k 分奇偶 我们 ...
- WIN7使用msg命令发送消息心得
昨天搞了一下午+一晚上,终于捣鼓出了一些奇奇怪怪的操作,成功发送了消息. 应实验要求,博主有幸在家里搞到了两台win7,其他的系统是不是这么操作就不太清楚了. 一开始实验指导书上是用net send发 ...
- poj2923 Relocation
Description Emma and Eric are moving to their new house they bought after returning from their honey ...
- Codeforces Round #241 (Div. 2) B. Art Union (DP)
题意:有\(n\)个画家,\(m\)幅画,每个画家负责\(m\)幅画,只有前一个画家画完时,后面一个画家才能接着画,一个画家画完某幅画的任务后,可以开始画下一幅画的任务,问每幅画最后一个任务完成时的时 ...
- windows server 2016 安装有线网卡驱动
为自己的本本安装了server 2016系统,但是官网下载的有线网卡驱动一直安不上,解决方法如下: 1.到Intel官网下载一个叫PROWinx64的驱动程序,解压到任意文件夹.依次进入PRO1000 ...
- [Python] Pandas 中 Series 和 DataFrame 的用法笔记
目录 1. Series对象 自定义元素的行标签 使用Series对象定义基于字典创建数据结构 2. DataFrame对象 自定义行标签和列标签 使用DataFrame对象可以基于字典创建数据结构 ...