java编写一个客户端代码,使用Java Socket创建客户端Socket的过程。

java WebSocket开发入门WebSocket - 简书
java WebSocket开发入门WebSocket
之前一个项目中九风开发app的用户的消息部分,由于项目比较紧,而且之前没有接触过WebSocket开发,所以暂时先使用轮询方式来开发消息模块,最近准备升级消息模块,准备使用tomcat的WebSocket来开发消息,写此文章方便自己也方便大家。
如需马上测试的scoket的请直接往下翻到代码出。
这篇文章中的代码不能运行在spring
mvc模式下,如需在mvc模式下运行,请参考这篇。
此文章中的后台代码不能直接用于Spring MVC中web层、service层直接调用,下篇文章准备写这个(还没写好,九风尽快),
文章中有需要改正的还请简友指出。
消息推送大家都不陌生,比如扣扣消息、某东某宝购物后的系统消息等等都是消息推送,在H5出来之前,消息推送基本上都是使用HTTP请求的,但HTTP请求只能在客户端发起请求后服务端返回消息,而不能再客户端未发起请求时服务端主动推送消息给客户端,而对于HTTP的方式实现消息推送时,有以下几种方式:
传统HTTP请求响应客户端服务器的交互图
轮询方式:客户端定时向服务端发送ajax请求,服务器接收到请求后马上返回消息并关闭连接。
优点:后端程序编写比较容易。
缺点:TCP的建立和关闭操作浪费时间和带宽,请求中有大半是无用,浪费带宽和服务器资源。
实例:适于小型应用。
长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
优点:在无消息的情况下不会频繁的请求,耗费资源小。
缺点:服务器hold连接会消耗资源,返回数据顺序无保证,难于管理维护。
实例:WebQQ、Hi网页版、Facebook IM。
长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求或是采用xhr请求,服务器端就能源源不断地往客户端输入数据。
优点:消息即时到达,不发无用请求;管理起来也相对方便。
缺点:服务器维护一个长连接会增加开销,当客户端越来越多的时候,server压力大!
实例:Gmail聊天
Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
优点:实现真正的即时通信,而不是伪即时。
缺点:客户端必须安装Flash插件,移动端支持不好,IOS系统中没有flash的存在;非HTTP协议,无法自动穿越防火墙。
实例:网络互动游戏。
webSocket:HTML5 WebSocket设计出来的目的就是取代轮询和长连接,使客户端浏览器具备像C/S框架下桌面系统的即时通讯能力,实现了浏览器和服务器全双工通信,建立在TCP之上,虽然WebSocket和HTTP一样通过TCP来传输数据,但WebSocket可以主动的向对方发送或接收数据,就像Socket一样;并且WebSocket需要类似TCP的客户端和服务端通过握手连接,连接成功后才能互相通信。
优点:双向通信、事件驱动、异步、使用ws或wss协议的客户端能够真正实现意义上的推送功能。
缺点:少部分浏览器不支持。
示例:社交聊天(微信、QQ)、弹幕、多玩家玩游戏、协同编辑、股票基金实时报价、体育实况更新、视频会议/聊天、基于位置的应用、在线教育、智能家居等高实时性的场景。
而websocket请求和服务器交互的如下图所示:
WebSocket 请求响应客户端服务器交互图
对比前面的http的客户端服务器的交互图可以发现WebSocket方式减少了很多TCP打开和关闭连接的操作,WebSocket的资源利用率高。
轮询和 WebSocket 实现方式的网络负载对比图
WebSocket规范
WebSocket一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。WebSocket API也被W3C定为标准。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
WebSocket 协议本质上是一个基于 TCP 的协议。为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息,附加信息如图所示:
WebSocket请求与响应头内容解析
浏览器支持:所有的最新浏览器支持最新WebSocket规范() ,从上介绍浏览器对WebSocket的支持如下表所示:
移动端支持:移动端基本都支持websocket了,其实和浏览器版支持的版本一样,具体支持如下所示:
android浏览器
Chrome 移动版
Firfox 移动版
Opera 移动版
Safari IOS版
服务器支持:目前主流的web服务器都已经支持,具体版本如下表所示:
应用服务器
WebSphere 8.0 以上版本支持,7.X 之前版本结合 MQTT 支持类似的 HTTP 长连接
WebLogic 12c 支持,11g 及 10g 版本通过 HTTP Publish 支持类似的 HTTP 长连接
IIS 7.0+支持
Tomcat 7.0.5+支持,7.0.2X 及 7.0.3X 通过自定义 API 支持
Jetty 7.0+支持
以下内容将使用tomcat服务器来实现Websocket
java WebSocket实现
Oracle 发布的 java 的 WebSocket 的规范是
,Tomcat从7.0.27开始支持WebSocket,从7.0.47开始支持JSR-356。
websocket简单实现分为以下几个步骤:添加websocket库、编写后台代码、编写前端代码。
添加websocket库
在maven中添加websocket库的代码如下所示:
&dependency&
&groupId&javax.websocket&/groupId&
&artifactId&javax.websocket-api&/artifactId&
&version&1.1&/version&
&scope&provided&/scope&
&/dependency&
九风有次没写&scope&字段,前端后台都会报错,大家记得加上就行。
前端错误内容:
 WebSocket connection to '{project-name}/websocket' failed: Error during WebSocket handshake: Unexpected response code: 404"
后台错误内容:
 Did not find handler method for [/websocket]
 Matching patterns for request [/websocket] are [/**]
 URI Template variables for request [/websocket] are {}
 Mapping [/websocket] to HandlerExecutionChain with handler       [org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler@398f0b1f] and 1 interceptor
 Last-Modified value for [/{project-name}/websocket] is: -1
编写后台代码
后台实现websocket有两种方式:使用继承类、使用注解;注解方式比较方便,一下代码中使用注解方式来进行演示。
声明websocket地址类似Spring MVC中的@controller注解类似,websocket使用@ServerEndpoint来进行声明接口:@ServerEndpoint(value="/websocket/{paraName}") ; 其中 “ { } ”用来表示带参数的连接,如果需要获取{}中的参数在参数列表中增加:@PathParam("paraName") Integer userId 。则连接地址形如:,其中每个连接可以设置不同的paraName的值。
注解、成员数据介绍:
public void onOpen(Session session) throws IOException{ }
-------有连接时的触发函数。 我们可以在用户连接时记录用户的连接带的参数,只需在参数列表中增加参数:@PathParam("paraName") String paraName。
2.@OnClose
public void onClose(){ }
------连接关闭时的调用方法。
3.@OnMessage
public void onMessage(String message, Session session) { }
-------收到消息时调用的函数,其中Session是每个websocket特有的数据成员,详情见4.
----每个Session代表了两个web socket断点的会话;当websocket握手成功后,websocket就会提供一个打开的Session,可以通过这个Session来对另一个端点发送数据;如果Session关闭后发送数据将会报错。
5.Session.getBasicRemote().sendText("message")
-------向该Session连接的用户发送字符串数据。
6.@OnError
public void onError(Session session, Throwable error) { }
--------发生意外错误时调用的函数。
后台代码:有以上基础后就直接上代码了.
import java.io.IOE
import javax.websocket.OnC
import javax.websocket.OnE
import javax.websocket.OnM
import javax.websocket.OnO
import javax.websocket.S
import javax.websocket.server.PathP
import javax.websocket.server.ServerE
import org.slf4j.L
import org.slf4j.LoggerF
* @Class: Test
* @Description: 简单websocket demo
* @author 九风萍舟
@ServerEndpoint(value="/websocketTest/{userId}")
public class Test {
private Logger logger = LoggerFactory.getLogger(Test.class);
private static String userId;
//连接时执行
public void onOpen(@PathParam("userId") String userId,Session session) throws IOException{
this.userId = userId;
logger.debug("新连接:{}",userId);
//关闭时执行
public void onClose(){
logger.debug("连接:{} 关闭",this.userId);
//收到消息时执行
@OnMessage
public void onMessage(String message, Session session) throws IOException {
logger.debug("收到用户{}的消息{}",this.userId,message);
session.getBasicRemote().sendText("收到 "+this.userId+" 的消息 "); //回复用户
//连接错误时执行
public void onError(Session session, Throwable error){
logger.debug("用户id为:{}的连接发送错误",this.userId);
error.printStackTrace();
ServerEndpoint报错: 原因是不能自动检测 ServerEndpoint 的包,解决方法:复制 import javax.websocket.server.ServerE 到文件程序 import 区域即可。
编写前端代码
后台代码编写了那么前端代码就几乎不用讲解了,相信大家一眼就能看得懂。
&!DOCTYPE html&
&meta charset="UTF-8"&
&title&&/title&
websocket Demo---- user000 &br /&
&input id="text" type="text" /&
&button onclick="send()"& Send &/button&
onclick="closeWebSocket()"& Close &/button&
&div id="message"&
&script type="text/javascript"&
//判断当前浏览器是否支持WebSocket
if('WebSocket' in window){
websocket = new WebSocket("ws://localhost:8080/Demo/websocketTest/user000");
console.log("link success")
alert('Not support websocket')
//连接发生错误的回调方法
websocket.onerror = function(){
setMessageInnerHTML("error");
//连接成功建立的回调方法
websocket.onopen = function(event){
setMessageInnerHTML("open");
console.log("-----")
//接收到消息的回调方法
websocket.onmessage = function(event){
setMessageInnerHTML(event.data);
//连接关闭的回调方法
websocket.onclose = function(){
setMessageInnerHTML("close");
//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
window.onbeforeunload = function(){
websocket.close();
//将消息显示在网页上
function setMessageInnerHTML(innerHTML){
document.getElementById('message').innerHTML += innerHTML + '&br/&';
//关闭连接
function closeWebSocket(){
websocket.close();
//发送消息
function send(){
var message = document.getElementById('text').
websocket.send(message);
在Chrome上打开前端代码后,马上就建立了连接,大家可以使用F12查看下建立连接的请求与响应,可以对比前面关于协议建立的部分进行学习。
建立连接后,想后台发送数据后,同时可以看到后台返回的信息:
在后台可以看到连接的建立和收到的数据:
对于其他功能功能大家可以自己测测。
websocket特别适合于需要实时数据传送的场景,比轮询方式效率高很多。
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式...
WebSocket 协议 此文仅作为 RFC6455 的学习笔记。篇幅太长超过了简书的单篇最大长度,故分为两篇,此篇记录 1~4 节,其余见 WebSocket 协议 5~10 节; 1.1 背景知识 由于历史原因,在创建一个具有双向通信机制的 web 应用程序时,需要利用...
Tips做一个终身学习的人。 在此章中,主要介绍以下内容: 什么是HTTP/2 Client API 如何创建HTTP客户端 如何使HTTP请求 如何接收HTTP响应 如何创建WebSocket的endpoints 如何将未经请求的数据从服务器推送到客户端 JDK 9将HT...
点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统开发框架, 屏蔽掉 IM 系统的复杂的细节, 对外提供较为简洁的 API 接口, 方便第三方应用快速集成 IM 功能。网易云信还开发了可供开发者们参考,如何使用...
从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗offer。我找的是java后台开发,把常见的问题分享给大家,有一些是自己的总结,有一些是网上借鉴的内容。希望能帮助到各位。预祝各位同学拿到自己心仪的offer...
2008年,我的高中生涯画上了句号。为了踏上大学这个所有学子们的圣堂,我跟我初中的班长燕子一起去找我小学班主任老李。老李是燕子的亲戚也是我的启蒙老师。燕子是想请教老李哪所重点大学的某某专业比较好,而我是去咨询哪所学校能收我,...
信手拈来片片云, 还有灵气在升腾。 几经风雨见世面, 远近飘香味道醇。 常将绿叶浸碧水, 不是美酒也醉人。 提壶把盞随身带, 一杯清茶长精神。
【意义定制】每一次的定制都是只属于自己的专属意义。而小意和你们的每次对话,也都是独一无二的回忆!希望各位要经常找小意聊天哦 ,让我们之间存着越来越多值得回忆的“意义”!
这是我听我朋友说的
95年左右吧,朔州城区一个村里的年轻人经不住外面的诱惑开始往外走挣钱,家里有点底子的就两家钱买了辆大车跑运输,那时候可有句话“车轮一响黄金万两。” 这个事就发生在了跑大车的路上,村口张刚兄弟三人合伙买了辆货车往外地拉煤,这次老二老三跑,老大在家休息。一...Java实现Socket的TCP传输实例
转载 &发布时间:日 12:35:33 & 作者:wo_soul
这篇文章主要介绍了Java实现Socket的TCP传输,实例分析了java通过socket实现TCP传输的相关技巧,需要的朋友可以参考下
本文实例讲述了Java实现Socket的TCP传输。分享给大家供大家参考。具体分析如下:
客户端发数据到服务端
* Tcp传输,客户端建立的过程。
* 1,创建tcp客户端socket服务。使用的是Socket对象。
* 建议该对象一创建就明确目的地。要连接的主机。
* 2,如果连接建立成功,说明数据传输通道已建立。
* 该通道就是socket流 ,是底层建立好的。 既然是流,说明这里既有输入,又有输出。
* 想要输入或者输出流对象,可以找Socket来获取。
* 可以通过getOutputStream(),和getInputStream()来获取两个字节流。
* 3,使用输出流,将数据写出。
* 4,关闭资源。
package com.socket.tcp.
import java.io.IOE
import java.io.OutputS
import java.net.S
import java.net.UnknownHostE
public class ClientDemo {
* @param args
* @throws IOException
* @throws UnknownHostException
public static void main(String[] args) throws UnknownHostException, IOException {
//客户端发数据到服务端
* Tcp传输,客户端建立的过程。
* 1,创建tcp客户端socket服务。使用的是Socket对象。
建议该对象一创建就明确目的地。要连接的主机。
* 2,如果连接建立成功,说明数据传输通道已建立。
该通道就是socket流 ,是底层建立好的。 既然是流,说明这里既有输入,又有输出。
想要输入或者输出流对象,可以找Socket来获取。
可以通过getOutputStream(),和getInputStream()来获取两个字节流。
* 3,使用输出流,将数据写出。
* 4,关闭资源。
//创建客户端socket服务。
//连接目标服务器的地址,192.168.1.100是目标服务器的地址,10002是目标服务器的端口
Socket socket = new Socket("192.168.1.100",10002);
//获取socket流中的输出流。 向服务器输出消息,即发消息到服务器
OutputStream out = socket.getOutputStream();
//使用输出流将指定的数据写出去。
out.write("tcp演示:哥们又来了!".getBytes());
//关闭资源。
socket.close();
服务端接收客户端发送过来的数据,并打印在控制台上。
* 建立tcp服务端的思路:
* 1,创建服务端socket服务。通过ServerSocket对象。
* 2,服务端必须对外提供一个端口,否则客户端无法连接。
* 3,获取连接过来的客户端对象。
* 4,通过客户端对象获取socket流读取客户端发来的数据
* 并打印在控制台上。
* 5,关闭资源。关客户端,关服务端。
package com.socket.tcp.
import java.io.IOE
import java.io.InputS
import java.net.ServerS
import java.net.S
public class ServerDemo {
//UDP:发送端、接收端 (无连接)
//TCP:客户端、服务端 (要连接)先启动服务端,在启动客户端
* @param args
* @throws IOException
public static void main(String[] args) throws IOException {
//服务端接收客户端发送过来的数据,并打印在控制台上。
* 建立tcp服务端的思路:
* 1,创建服务端socket服务。通过ServerSocket对象。
* 2,服务端必须对外提供一个端口,否则客户端无法连接。
* 3,获取连接过来的客户端对象。
* 4,通过客户端对象获取socket流读取客户端发来的数据
并打印在控制台上。
* 5,关闭资源。关客户端,关服务端。
//1创建服务端对象。
ServerSocket ss = new ServerSocket(10002);
//监听应用所在服务器的10002端口,
//看有没有客户端连接过来,或者发送消息
//2,获取连接过来的客户端对象。
Socket s = ss.accept();//阻塞式.
String ip = s.getInetAddress().getHostAddress();
//获取连接过来客户端的IP地址
//3,通过socket对象获取输入流,要读取客户端发来的数据,
InputStream in = s.getInputStream();
byte[] buf = new byte[1024];
int len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(ip+":"+text);
s.close();
ss.close();//关闭服务器,理论上是不用关的
运行效果图:(先启动服务端,后启动客户端)
希望本文所述对大家的java程序设计有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具java简答题 如何创建socket连接的过程_百度知道
java简答题 如何创建socket连接的过程
我有更好的答案
java socket建立连接的过程如下:socket 1、 首先调用Socket类的构造函数,以服务器的指定的IP地址或指定的主机名和指定的端口号为参数,创建一个Socket流,在创建Socket流的过程中包含了向服务器请求建立通讯连接的过程实现。2、 建立了客户端通讯Socket后。就可以使用Socket的方法getInputStream()和getOutputStream()来创建输入/输出流。这样,使用Socket类后,网络输入输出也转化为使用流对象的过程。3、 使用输入输出流对象的相应方法读写字节流数据,因为流连接着通讯所用的Socket,Socket又是和服务器端建立连接的一个端点,因此数据将通过连接从服务器得到或发向服务器。这时我们就可以对字节流数据按客户端和服务器之间的协议进行处理,完成双方的通讯任务。4、 待通讯任务完毕后,我们用流对象的close()方法来关闭用于网络通讯的输入输出流,在用Socket对象的close()方法来关闭Socket。
软件工程师
///简单的Client/Server程序设计//服务端&import&java.io.*;import&java.net.*;public&class&Service&{&public&static&void&main(String&args[])&{&&try&{&&&ServerSocket&server&=&&&&try&{&&&&server&=&new&ServerSocket(4700);&&&&//&创建一个ServerSocket在端口4700监听客户请求&&&}&catch&(Exception&e)&{&&&&System.out.println(&can&not&listen&to:&&+&e);&&&&//&出错,打印出错信息&&&}&&&System.out.println(&server------------------------------&);&&&Socket&socket&=&&&&try&{&&&&socket&=&server.accept();&&&&//&使用accept()阻塞等待客户请求,有客户&&&&//&请求到来则产生一个Socket对象,并继续执行&&&}&catch&(Exception&e)&{&&&&System.out.println(&Error.&&+&e);&&&&//&出错,打印出错信息&&&}&&&String&&&&BufferedReader&is&=&new&BufferedReader(new&InputStreamReader(socket&&&&&.getInputStream()));&&&//&由Socket对象得到输入流,并构造相应的BufferedReader对象&&&PrintWriter&os&=&new&PrintWriter(socket.getOutputStream());&&&//&由Socket对象得到输出流,并构造PrintWriter对象&&&BufferedReader&sin&=&new&BufferedReader(new&InputStreamReader(&&&&&System.in));&&&//&由系统标准输入设备构造BufferedReader对象&&&System.out.println(&Client:&&+&is.readLine());&&&//&在标准输出上打印从客户端读入的字符串&&&line&=&sin.readLine();&&&//&从标准输入读入一字符串&&&while&(!line.equals(&bye&))&{&&&&//&如果该字符串为&&bye&,则停止循环&//&向客户端输出该字符串&&&&&os.println(line);&//&刷新输出流,使Client马上收到该字符串&&&&&&&&os.flush();&&&&//&从Client读入一字符串,并打印到标准输出上&&&&&System.out.println(&Client:&&+&is.readLine()+&\n&);&&&&&&&line&=&sin.readLine();&&&&//&从系统标准输入读入一字符串&&&}&//&继续循环&&&os.close();&//&关闭Socket输出流&&&is.close();&//&关闭Socket输入流&&&socket.close();&//&关闭Socket&&&server.close();&//&关闭ServerSocket&&}&catch&(Exception&e)&{&&&System.out.println(&Error:&&+&e);&&&//&出错,打印出错信息&&}&}}//客户端import&java.io.*;import&java.net.*;public&class&Client&{&public&static&void&main(String&args[])&{&&try&{&&&Socket&socket&=&new&Socket(&127.0.0.1&,4700);&&&//&向本机的4700端口发出客户请求&&&BufferedReader&sin&=&new&BufferedReader(new&InputStreamReader(System.in));&&&&&&&&//&由系统标准输入设备构造BufferedReader对象&&&PrintWriter&os&=&new&PrintWriter(socket.getOutputStream());&&&//&由Socket对象得到输出流,并构造PrintWriter对象&&&BufferedReader&is&=&new&BufferedReader(new&InputStreamReader(socket&&&&&.getInputStream()));&&&System.out.println(&Client------------------------------&);&&&//&由Socket对象得到输入流,并构造相应的BufferedReader对象&&&String&&&&readline&=&sin.readLine();&//&从系统标准输入读入一字符串&&&while&(!readline.equals(&bye&))&{&&&&//&若从标准输入读入的字符串为&&bye&则停止循环&&&&os.println(readline);&&&&//&将从系统标准输入读入的字符串输出到Server&&&&os.flush();&&&&//&刷新输出流,使Server马上收到该字符串&&&&System.out.println(&Server:&&+&is.readLine());&&&&//&从Server读入一字符串,并打印到标准输出上&&&&readline&=&sin.readLine();&//&从系统标准输入读入一字符串&&&}&//&继续循环&&&os.close();&//&关闭Socket输出流&&&is.close();&//&关闭Socket输入流&&&socket.close();&//关闭Socket&&}&catch&(Exception&e)&{&&&System.out.println(&Error&&+&e);&//出错,则打印出错信息&&}&}}&&&&//自己去研究代码&还是挺详细的
为您推荐:
其他类似问题
您可能关注的内容
socket的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。java socket 服务端程序怎么写
[问题点数:40分,结帖人sichuanzog]
java socket 服务端程序怎么写
[问题点数:40分,结帖人sichuanzog]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|21:58 提问
使用Java socket让客户端与服务器建立连接后,服务器如何判断来自客户端的各类请求
初学java,目前写了一个服务端和一个客户端。大致了解了如何socket通信是如何操作的,并且初步实现了客户端和服务端的通信。也仅仅是是接受和返回简单的字符串。部分代码如下
public void run(){
serverSocket=new ServerSocket(SERVER_PORT_ONE);
System.out.println("serversocket已创建");
while(true){
clientSocket=serverSocket.accept();
System.out.println("监测到了socket");
receiveThread=new SocketThread(clientSocket);
//开启新线程处理请求
receiveThread.start();
}catch(IOException e){
System.out.println(e.getMessage());
这是socket监听的代码。当服务器监听到了socket之后,开启一个新线程去处理。
socketthread类的run()方法来接受数据
public void run(){
String Command=
String str=
output.println("服务器已经接受你的连接\n");
while(true){
str=input.readLine();
System.out.println("监测数据如下:"+str);
}catch(IOException e){
System.out.println(e.getMessage());
Command=str.trim().toUpperCase();
if(str==null || Command.equals("QUIT")) {
clientSocket.close();//关闭套接字
System.out.println("clientSocket已经断开连接");
}catch(IOException e){
System.out.println(e.getMessage());
在while循环里面,服务端会不断读取来自客户端的内容,然后输出来。如果读到quit,就表示断开连接,并关闭socket。
现在的问题就是, 如果我的客户端的请求十分多样,比如发送语音,视频,图片或者数据给服务器进行处理,我的服务端必须做出相应的处理,请问如何做到这点啊。
我自己想的思路是客户端发送数据前先要发送一个header标签,表示想干什么。然后读取到了之后客户端再判断,然后分给不同的函数去处理。不知道这样好不好,如下所示。
while(true){
str=input.readLine();
if(str.equals("图片")){
图片相关函数(socket );
if(str.equals("视频")){
视频处理相关函数(socket );
if(str.equals("数据")){
数据处理相关函数(socket );//如各种算法
System.out.println("监测数据如下:"+str);
}catch(IOException e){
System.out.println(e.getMessage());
Command=str.trim().toUpperCase();
if(str==null || Command.equals("QUIT")) {
不知道是否可行。
第二个问题,我的服务器要主动推送数据给客户端该如何实现,肯定不能写在这个线程里面。写在其他地方我的类和函数如何得到这个线程里的socket呢。
按赞数排序
这就是通信双方事先约定好通信规则,也就是所谓的协议的作用了。
各种通信业务,都是先定义好通信协议,然后才是通信操作处理了。
自己定义相关的字段,服务器根据协议判断。
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!
我最近也在研究socket,针对你的第二个问题,我有个想法,我们一起探讨下:
新建一个成员变量buffer,把要传输给客户端的数据放在这里面,下次客户端连接的时候发送给客户端
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐

我要回帖

更多关于 java 编写客户端 的文章

 

随机推荐