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 ...
随机推荐
- 子网划分、变长子网掩码和TCP/IP排错__IP寻址排错
1.Cisco推荐使用的排错四步曲: ping环回地址:ping NIC:ping默认网关和ping远端设备. 1. 打开DOS窗口并ping127.0.0.1.这是一个诊断或环回地址,如果你得到一个 ...
- ASP.Net Core 5.0 MVC 配置文件读取,Startup 类中ConfigureServices 方法、Configure 方法的使用
配置文件读取 1. 新建FirstController控制器 在appsettings文件内容替换成以下代码 { "Position": { "Title": ...
- Hive创建HBase,ES外部表
1.创建HBase外部表 CREATE EXTERNAL TABLE `ods_women`( `rowkey` string COMMENT 'from deserializer', `articl ...
- HDU-6874 Decision 倍增 (2020 HDU多校 D7 D)
Decision 题意 从 \([0,t]\) 中等概率的选取两个数字 \(v_1,v_2\), 定义序列 \(X\) 有 \(X_0=v1+v2,X_{n+1}=(aX_n+c) \mod m\). ...
- python给字段名和值都加上引号
import re c = ''' Accept: application/json, text/javascript, */*; q=0.01 Accept-Encoding: gzip, defl ...
- Codeforces Round #579 (Div. 3) D2. Remove the Substring (hard version) (思维,贪心)
题意:给你一个模式串\(t\),现在要在主串\(s\)中删除多个子串,使得得到的\(s\)的子序列依然包含\(t\),问能删除的最长子串长度. 题解:首先,我们不难想到,我们可以选择\(s\)头部到最 ...
- Codeforces Round #652 (Div. 2) C. RationalLee 贪心
题意: t组输入,你有n个数,还有k个朋友,每一个朋友需要wi个数.意思就是你要给第i个朋友分配wi个数,输入保证w1+w2+...+wk=n 一个朋友的兴奋值是你分配给他的数中最大值加上最小值的和( ...
- python代理池的构建2——代理ip是否可用的处理和检查
上一篇博客地址:python代理池的构建1--代理IP类的构建,以及配置文件.日志文件.requests请求头 一.代理ip是否可用的处理(httpbin_validator.py) #-*-codi ...
- HttpClient&&RestTemplate学习
1. 什么是HttpClient HttpClient是Apache下面的子项目,可以提供高效的,最新的,功能丰富的支持HTTP协议的客户端编程工具包. 2. 为什么要学习HttpClient Htt ...
- win10 远程桌面 ubuntu
一.获取本机ip 通过ip查询网址来查询本机外网地址 二.下载远程链接软件 下载向日葵,注册账号 三.远程链接 将连接端与被连接端分别绑定账号,输入相应ip地址,即可连接.