java实例练习——基于TCP/IP协议的多客户端通信

  先说一下大概的思路:

  应用多线程来实现服务器与多客户端之间的通信

  1、服务器端创建ServerSocket,循环调用accept()等待客户端连接;

  2、客户端创建一个Socket并请求与服务器端连接;

  3、服务器端接受客户端请求,创建Socket与该客户端简历专线连接;

  4、建立连接的两个Socket在一个单独的线程上对话;

  5、服务器端继续等待其他新的连接。

  闲话不多说,直接上代码:

package net;
/*** 1、客户端*/import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;public class Client {public static void main(String[] args) {try {//1、创建Socket,与服务器建立连接Socket socket = new Socket("localhost", 8889);			//2、向服务器端发送消息OutputStream os = socket.getOutputStream();			PrintWriter pwriter = new PrintWriter(os); //将Socket的输出字节流包装成打印流pwriter.write("用户名:sysker ;  密码:sys154");//刷新流pwriter.flush();//3、关闭资源socket.shutdownOutput();//3、获取输入流InputStream inputStream = socket.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream);BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String getMsage=null;while((getMsage=bufferedReader.readLine())!=null){System.out.println("客户端正在等待响应,服务器说:"+getMsage);}	//socket.shutdownInput();bufferedReader.close();inputStream.close();inputStreamReader.close();pwriter.close();os.close();			socket.close();} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
 
package net;
/*** 2、服务器端*/import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class ManyClientServer {public static void main(String[] args) {Socket socket = null;int clientCount = 0;try {ServerSocket serverSocket = new ServerSocket(8889);while(true){socket = serverSocket.accept();ManyClientThread manyClientThread = new ManyClientThread(socket);manyClientThread.start();clientCount++;System.out.println("客户端数量"+clientCount);System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());}	} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
 
package net;
/*** 3、服务器通信线程*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;public class ManyClientThread extends Thread{Socket socket = null;BufferedReader bufferedReader = null;public ManyClientThread(Socket socket){this.socket = socket;}public void run(){try {			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));String mString = null;while((mString = bufferedReader.readLine())!=null){System.out.println("我是服务器,客户端说"+mString);				}bufferedReader.close();socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally{if(bufferedReader!=null){try {bufferedReader.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(socket!=null){try {socket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
}

转载于:https://www.cnblogs.com/caoleiCoding/p/6441622.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429601.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows资源管理器已停止工作后,使用命令提示窗口拷贝文件和运行exe程序

电脑异常现象: 需要从优盘拷贝NetAssist.exe软件至电脑进行运行,发现双击无法打开我的电脑和文件夹,点击提示的重新启动程序问题后仍存在,重启电脑、关机再开机该问题依然存在。插入优盘后可以识别到,但无法打开优盘&…

DAC8563芯片参考手册重要内容总结

DAC8563的主要参数: 供电电压:2.7~5.5V分辨率:16bit,双通道通讯接口:3线SPI串行通讯,速率最高至50MHz,支持3.3V和5V单片机(有MOSI/CLK/CS,无MISO)内部自带2.…

20155220 吴思其 2016-2017《java程序设计》第一周总结

对第一章和第二章的学习 通过了前两章的学习,我了解到了java的由来以及JVM/JRE/JDK三大平台 JDK JDK 是 Java 语言的软件开发工具包。 JDK是整个JAVA的核心,包括了Java运行环境,一堆Java工具(javac/java/jdb等)和Java基…

手把手教你从0创建STM32串口空闲+DMA数据接收工程

串口通讯是嵌入式系统中最常用的通讯方式。 STM32的串口接收普通的方式是在串口读数据寄存器非空RXNE中断(Read data register not empty)中1个字节1个字节的接收串口数据,一帧数据的接收完成可以使用结束帧判断,也可以使用定时器…

CSS display属性的值及作用

display 的属性值有:none|inline|block|inline-block|list-item|run-in|table|inline-table|table-row-group|table-header-group|table-footer-group|table-row|table-column-group|table-column|table-cell|table-caption|inherit其中常用的的有none、inline、blo…

TC214B直流电机控制芯片

潘多拉开发板中通过TC214B电机驱动芯片驱动板载直流电机,因此需要先了解TC214B芯片的主要功能及其使用方法。 通过以上资料可以了解到,MCU控制TC214B从而进行直流电机转动方向,方向控制(即前进/后退)主要是通过控制MCU…

题目1065:输出梯形

AC: #include<iostream> using namespace std; int main() {int h;while(cin>>h){int i,j,k,t;k(h-1)*2;th;for (i0;i<h;i)//h在此处已用&#xff0c;所以用th来代替重用&#xff1b;{ for (j0;j<k;j)cout<<" ";k-2;for (j0;j<t;j)cout&…

《C语言深度解剖》中的.c/.h 程序模板及函数注释风格

编程规范和变量命令规范对于代码的可阅读性、可维护性有着很大的影响。编程规范有很多&#xff0c;大公司也会制定自己公司的编程规范&#xff0c;如《华为技术有限公司c语言编程规范》等。对于个人编程来说没必要将自己编写的代码按照每一种编程规范去规范&#xff0c;因为不同…

每天学点Linux命令:倒叙打印文件第二行的前100个大写字母

sed -n 2p afile | grep [[:upper:]] -o | tr -d \n | cut -c1-100 | rev 处理第二行 grep:提取大写字母 o: 不显示非结果 tr:删除换行 Cut&#xff1a;截取1-100个字符 rev:逆序 断断续续搞了好长时间。最后还是解决了&#xff1b;man是个好东西~ 好人&…

ST7789V2 LCD驱动芯片

ST7789V2是一个单芯片TFT-LCD驱动器。该芯片可以直接连接到外部MCU&#xff0c;支持并行8080系列的8位/9位/16位/18位接口&#xff0c;也支持SPI串行通讯接口。 显示数据可以存储在240x320x18bits的片上显示数据RAM中。 它可以在没有外部操作时钟的情况下执行显示数据RAM读写操…

关于Java Collections的几个常见问题

列举几个关于Java Collections的常见问题并给出答案。 1. 什么时候用LinkedList&#xff0c;什么时候用ArrayList&#xff1f; ArrayList是使用数组实现的list&#xff0c;本质上就是数组。ArrayList中的元素可以通过索引随机获取一个元素。但是如果该数组已满&#xff0c;当添…

STM32 USB虚拟串口原理(上)

USB虚拟串口是使用USB的CDC&#xff08;CDC为communication device class(virtual port com)&#xff09;类实现的一种通讯接口。使用STM32自带的USB slave功能可以在电脑上实现一个USB虚拟串口&#xff0c;在电脑上可以直接使用串口调试助手打开该虚拟串口和STM32进行通讯。ST…

RT-Thread使用ENV生成工程时自己添加的文件被清掉的解决方法

在项目中难得一次就可以将需要的模块或组件包添加完成&#xff0c;因此在实际开发中经常会遇到在未完成的项目中增加软件包或使能硬件功能的情况。一般我们会使用RT-Thread的ENV辅助开发环境的menuconfig图形化系统配置工具对组件包进行配置&#xff0c;配置完后使用pkgs --upd…

怎样使用两行代码实现博客园打赏功能

也许大家看博客园博客的时候&#xff0c;遇到过一些博客右侧&#xff0c;展示了打赏二维码~ 如下图所示 那么&#xff0c;这是怎么实现的呢~~~ 不错&#xff0c;你没猜错&#xff0c;他们使用的是本人写的一个js插件--tctip。 大家搜一下&#xff0c;还能搜到网上有些tctip的教…

STM32 HAL库 .c/.h 文件介绍

HAL库中各个文件的介绍&#xff1a; startup_stm32l475xx.s 启动文件的主要作用是进行RAM中堆、栈内存的分配和初始化&#xff0c;中断向量表及中断函数的定义等&#xff0c;进行完这一系列工作后执行系统复位从而跳转至用户main函数开始执行。 stm32l4xx_hal_ppp.c/.h 基本…

【bzoj3514】 Codechef MARCH14 GERALD07加强版

http://www.lydsy.com/JudgeOnline/problem.php?id3514 (题目链接) 题意 给出$n$个点$m$条边的无向图&#xff0c;询问保留图中编号在$[l,r]$的边的时候图中的连通块的个数。 Solution 将边的编号作为权值用LCT维护一个最大生成树&#xff0c;同时记录一下加入当前边$i$会把哪…

C语言中将浮点数四舍五入取整的宏定义(支持正数和负数的圆整)

在实际工程项目中经常会需要将浮点型的计算结果四舍五入为整型&#xff0c;因此定义如下宏定义对浮点型进行圆整。若所需圆整的浮点型结果正负号无法确定&#xff0c;则需要将结果圆整为带符号的整型结果如int8_t、int16_t、int32_t等。对于结果>0的浮点数和<0的浮点数圆…

原码、反码、补码,计算机中所有的数都是以补码的形式存储的

计算机中所有的数都是以补码的形式存储的 原码&#xff1a; 一个数的原码就是其10进制的数转换为2进制数&#xff0c;正数的原码符号位为0&#xff0c;负数的原码符号位为1。 如10进制的数26667&#xff0c;将其转换为2进制为0110 1000 0010 1011。10进制的数-26667&#xf…

RT-Thread设备框架学习感悟

前面几周跟着野火的教程从0到1实现了RT-Thread的内核&#xff0c;对RT-Thread的调度机制和线程、定时器的底层实现有了总体的了解。后面还需进一步对齐实现细节进行探索&#xff0c;但大致先了解其框架&#xff0c;后面再进行细致的了解。在学习新知识时&#xff0c;最重要的是…

Tensorflow之RNN,LSTM

Tensorflow之RNN,LSTM #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ tensorflow之RNN 循环神经网络做手写数据集分类 """import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data#设置随机数来比较两种计算…