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 ...
随机推荐
- Flink-v1.12官方网站翻译-P001-Local Installation
本地安装 按照以下几个步骤下载最新的稳定版本并开始使用. 第一步:下载 为了能够运行Flink,唯一的要求是安装了一个有效的Java 8或11.你可以通过以下命令检查Java的正确安装. java - ...
- docker(4)解决pull镜像速度缓慢
前言 上一篇讲到pull 镜像,但是pull镜像的时候下拉的速度实在感人,有什么解决办法吗?我们只需将docker镜像源修改为国内的 将docker镜像源修改为国内的: 在 /etc/docker/d ...
- 一周精彩内容分享(第 1 期):"世纪逼空大战"
这里记录过去一周,我看到的值得分享的东西. 一方面是整理记录一下自己一周的学习,另一方面也是期待自己有更多的输出,有更多的价值. 周刊开源(Github:wmyskxz/weekly),欢迎提交 is ...
- JVM之堆参数
1.Java 7和Java 8区别 Java 7堆结构 JDK 1.8之后将最初的永久代取消了,由元空间取代. 在Java8中,永久代已经被移除,被一个称为元空间的区域所取代.元空间的本质和永久代类似 ...
- windows10上下载远程控制软件之后导致windows10亮度调节功能不能使用
出现了通用即插即用监视器就可以了
- Codeforces Global Round 11 C. The Hard Work of Paparazzi (DP)
题意:有\(r\)X\(r\)的网格图,有\(n\)位名人,会在\(t_i\)时出现在\((x_i,y_i)\),如果过了\(t_i\)名人就会消失,从某一点走到另外一点需要花费的时间是它们之间的曼哈 ...
- kubernetes进阶(一) kubectl工具使用详解
管理k8s核心资源的三种基本方法: 一.陈述式-主要依赖命令行工具 --可以满足90%以上的使用场景,但是缺点也很明显: 命令冗长,复杂,难以记忆 特定场景下,无法实现管理需求 对资源的增.删.查操 ...
- Leetcode(94)-二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 思路:和上篇的前序遍历一样,同样有递归和非递归的做法 (1)递归 vecto ...
- docker安装CentOS7及JNI使用相关过程记录
docker pull centos:centos7(拉取镜像) docker run -itd --name centos-test centos:centos7 (运行容器) docker exe ...
- 错误记录:MQJE001: 完成代码为 '2',原因为 '2035'。
在windows server 2008上安装websphere mq7.5 服务端,建立队列.通过java client向我的机器的队列发送消息和接收消息. mq安装成功,队列管理器.队列.通道也都 ...