多个client与一个server端通信的问题
多个client与一个server端通信的问题
上篇博文主要是讲的关于client与server端的通信问题。在上篇博文中当我们仅仅有一个client訪问我们的server时是能够正常执行的,可是当我们有多个client訪问我们的server时。我们的代码就不能正常工作了。
而在现实中。我们是非常少有一个server仅仅供一个client訪问的,此篇博文就是来解决多个client訪问我们server端的问题。
解决方法:
- 用一个多线程就能够解决
实现代码例如以下:
第一个:client的代码例如以下:
package org.wrh.socketserver;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class MyClient {
public static void main(String[] args) throws Exception {
//第一步:创建clientSocket
Socket s=new Socket("192.168.1.107",4567);
//第二步:读取向server端发送的数据文件
FileInputStream fis=new FileInputStream("d:\\100.txt");
//第三步:获取Socket输出流
OutputStream os=s.getOutputStream();
byte[] buf=new byte[1024];
int len;
while((len=fis.read(buf))!=-1){
os.write(buf, 0, len);
}
//刷新一下缓冲区的数据
os.flush();
//告诉server。我的数据已经发送完了
s.shutdownOutput();
//将server返回的数据读取出来
InputStream is=s.getInputStream();
byte[] buf_in=new byte[1024];
int len_in=is.read(buf_in);
System.out.println(new String(buf_in,0,len_in));
fis.close();
os.close();
is.close();
s.close();
}
}
第二个:server端的代码例如以下
package org.wrh.socketserver;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
public static void main(String[] args) throws Exception {
//第一步:建立server端Socket
ServerSocket ss=new ServerSocket(4567);
while(true){
//第二步:获取client
Socket socket=ss.accept();
/*
* 当我们考虑多个client訪问server端的时候,我们就须要考虑多线程的问题
* */
new Thread(new TaskWork(socket)).start();
}
}
}
当中,线程类的代码例如以下
package org.wrh.socketserver;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TaskWork implements Runnable {
Socket socket;
public TaskWork(Socket socket){
this.socket=socket;
}
@Override
public void run() {
// TODO Auto-generated method stub
int count=0;
/*
* 获取client的ip地址
* */
String ip=socket.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//第三步:获取Socket的输入流,对client发送来的数据进行读取
try{
InputStream is=socket.getInputStream();
/*
*读取数据,并 将数据写入到文件里
* */
File dir=new File("d:\\wu");
if(!dir.exists()){
dir.mkdirs();
}
File file=new File(dir,ip+".txt");
/*
* 假设在server端此文件已经存在的处理办法
* */
if(file.exists()){
file=new File(dir,ip+"("+(++count)+").txt");
}
FileOutputStream fos=new FileOutputStream(file);
byte[] buf=new byte[1024];
int len=0;
while((len=is.read(buf))!=-1){
fos.write(buf, 0, len);
}
fos.flush();
//给client一个反馈信息
OutputStream os=socket.getOutputStream();
os.write("收到数据".getBytes());
//以下为关闭各种要关闭的资源
fos.close();
is.close();
os.close();
socket.close();
}
catch(Exception e){
e.printStackTrace();
}
}
}
假设上篇博文的代码你弄懂了。这篇博文的代码理解起来就相当easy啦
说明
- 上面的代码中。主线程一直在等待这client的连接,仅仅要一有client连接进来。就会开启一个子线程来执行对应的操作。
多个client与一个server端通信的问题的更多相关文章
- Python的XMLRPC机制:实现跨进程间、client/server端通信
SimpleXMLRPCServer模块式python语言的一个基于 xml 格式的进程间通信的基础框架. SimpleXMLRPCServer是一个单线程的服务器,这意味着,如果几个客户端同时发出多 ...
- 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)
非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...
- Socket实现client和server端通信(Java)(转)
转自: https://blog.csdn.net/yayun0516/article/details/50819147 https://www.jianshu.com/p/2d4f223f1462 ...
- 上机题目(0基础)- Java网络操作-Socket实现client和server端通信二(Java)
上一节实现了client像server端发送请求.本节将实现server端向client回传信息.实现原理非常easy,在原来的基础上.在server端实现输出流,在client实现输入流就可以,详细 ...
- 使用Netty进行Android与Server端通信实现文字发送接收与图片上传
ANOTHER TITLE: Let’s use netty to achieve text send and receive and image transfer to server based ...
- oracle client 低于 oracle server 端,导致报错ORA-01882
https://forums.toadworld.com/t/ora-01882-when-i-want-to-view-records-con-dba-scheduler-jobs-toad-10- ...
- 微服务学习三:springboot与springcloud集成之Eurake的使用(server端,client端)
这个多亏了网站上的一个大神的博客: http://blog.csdn.net/forezp/article/details/70148833 强烈推荐学习: 1.springcloud是什么,这个大家 ...
- navicat连接oracle一个错误:ORA-12737 Instant Client Light:unsupported server character set ZHS16GBK
今天使用Navicat连接Oracle数据库.它报告了以下错误:"ORA-12737 Instant Client Light:unsupported server character se ...
- HBase 协处理器编程详解第一部分:Server 端代码编写
Hbase 协处理器 Coprocessor 简介 HBase 是一款基于 Hadoop 的 key-value 数据库,它提供了对 HDFS 上数据的高效随机读写服务,完美地填补了 Hadoop M ...
随机推荐
- 共享win7ip,虚拟机nat模式连接,电脑重启之后,无法连接
问题原因:VMware NAT Service没有设置为开机启动 解决办法: 1.按win+r,输入services.msc,点击确定: 2.服务窗口中找到VMware NAT Service,双击: ...
- 让xamarin的Entry绑定时,支持Nullable类型
xamarin.forms默认情况下,如果属性是double?类型,绑定到Entry上,是无法实现双向绑定的, 可以自定义Converter实现双向绑定 public class NullableCo ...
- php基础查找算法
1.顺序查找 function line_search($array,$tar) { if(!is_array($array) || count($array) < 1) return fals ...
- django 标签
django标签 {% if/for/ifequal/ifnotequal condition %} ...{{ name|first|lower}}{# interpretation:lower t ...
- iPhoneX 适配H5页面的解决方案
由于在iPhonex在状态栏增加了24px的高度,对于通栏banner规范的内容区域会有遮挡情况. 解决方案:在页面通栏banner顶部增加一层高度44px的黑色适配层,整个页面往下挪44px,这种做 ...
- [Python3网络爬虫开发实战] 2.2-网页基础
用浏览器访问网站时,页面各不相同,你有没有想过它为何会呈现这个样子呢?本节中,我们就来了解一下网页的基本组成.结构和节点等内容. 1. 网页的组成 网页可以分为三大部分——HTML.CSS和JavaS ...
- 零基础入门学习Python(15)--格式化
前言 上节课我们介绍了字符串N多种奇葩方法的用法,但是我们唯独漏掉了format方法,那为何不把format方法和上节课的内容一起讲呢? 因为小甲鱼觉得format方法,跟今天的主题是如出一辙的,都是 ...
- 编译Nginx, 并使用自签证书实现https访问
1. 编译安装nginx1.8.1 [root@centos7 nginx-1.8.1]# ./configure --prefix=/usr/local/nginx.1.8.1 --with-htt ...
- buf.values()
buf.values() 返回:{Iterator} 创建并返回一个包含 Buffer 值(字节)的迭代器.当 Buffer 使用 for..of 声明时将自动调用该函数. const buf = B ...
- JavaScript之作用域和闭包
一.作用域 作用域共有两种主要的工作模型:第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另外一种叫作动态作用域: JavaScript所采用的作用域模式是词法作用域. 1.词法作用域 词法作 ...