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 ...
随机推荐
- linux 文件目录解释笔记(未完待续...)
目录 应放置档案内容 /bin 系统有很多放置执行档的目录,但/bin比较特殊.因为/bin放置的是在单人维护模式下还能够被操作的指令. 在/bin底下的指令可以被root与一般帐号所使用,主要有:c ...
- Java链表(英雄增删查改)
链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 小结: 1.链表是以节点的方式来存储,是链式存储. 2.每个节点包含 data 域, next 域:指向下一个节点. 3 ...
- linux(1)Mac上传文件到Linux服务器
前言 我们使用mac时,想让本地文件上传至服务器,该怎么办呢 windows系统,我们可以使用xftp或者rz命令,那么mac呢? mac系统,我们可以使用sftp.scp或者rz命令,本文介绍sft ...
- sqoop使用以及常见问题
1.hdfs文件的权限问题 问题分析与解决: 根据报错信息是hdfs文件的权限问题,命令进入集群执行的用户为null,而hdfs文件所有者为hdfs. 要么以用户hdfs执行命令,要么调整hdfs文件 ...
- 2019牛客暑期多校训练营(第二场)D Kth Minimum Clique(第k团)
题意:给你n个点 求第k小的团 思路:暴力bfs+bitset压位 #include <bits/stdc++.h> using namespace std; const int N = ...
- 2013-2014 ACM-ICPC, NEERC, Eastern Subregional Contest PART (8/10)
$$2013-2014\ ACM-ICPC,\ NEERC,\ Eastern\ Subregional\ Contest$$ \(A.Podracing\) 首先枚举各个折现上的点,找出最小宽度,然 ...
- 2019牛客多校 Round9
Solved:3 Rank:181 H Cutting Bamboos 这个东西好像叫整体二分 #include <bits/stdc++.h> using namespace std; ...
- Codeforces Round #665 (Div. 2) D - Maximum Distributed Tree dfs贡献记录
题意: t组输入,每组数据中n个节点构成一棵树,然后给你n-1条边.给你一个m,然后给你m个k的素数因子,你需要给这n-1条边都赋一个权值,这n-1条边的权值之积应该等于k.如果k的素数因子数量小于n ...
- Python——Django框架——django-simple-captcha(验证码)
一.引用 包 pip install django-simple-captcha 二.将captcha加入setting的 INSTALLED_APPS 三.运行python manager.py m ...
- Excel导出时设置单元格的格式为文本
问题: 用excel导出数据时,如何设置单元格格式的数字分类为"文本",默认是"常规"? 比如:导出编码0235A089,在Excel查看默认显示的是没有前面的 ...