socket通信
socket通信
一:socket基于Tcp连接,数据传输有保证
二:socket连接的建立过程:
1:服务器监听
2:客户端发出请求
3:建立连接
4:通信
三:一个简单的例子:服务器端每隔一段时间发一些信息
1:创建一个服务器端监听的线程
public class ServerListener extends Thread {
public void run() {
try {
//服务器端的socket
ServerSocket serversocket=new ServerSocket();
while(true){
//收到客户端的socket,
Socket socket=serversocket.accept();
//建立连接,弹窗
JOptionPane.showMessageDialog(null, "有客户端连接到本地的22345端口"); //将socket传递到新的线程(socket通信的线程)
new ChatSocket(socket).start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
通信线程ChatSocket 类继承Thread,重写run()方法:
public class ChatSocket extends Thread { Socket socket; public ChatSocket(Socket socket) {
super();
this.socket = socket;
} public void out(String out){
try {
socket.getOutputStream().write(out.getBytes("utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} public void run() {
int count=;
while(true){
count++;
out("loop:"+count);
try {
sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }
新建一个程序测试类
public class MyServerSocket { /**在cmd里面是输入telent localhost 22345就可建立连接
* @param args
*/
public static void main(String[] args) {
new ServerListener().start();
}
}
效果如下:
看到这里,可以知道可以同时进行多个客户端的连接
上面的实例只能是服务器发送消息给客户端,但是客户端不能发送消息,怎么办呢?
请看下面
二:多个客户端同时在线通信,一个客户端发送一条消息,然后全部的客户端都可以收到
这里要新建一个socket管理类,把所有的ChatSocket放在一起,用到了Vector<>,可增长的对象数组
public class ChatManager { public void ChatManger(){} private static final ChatManager cm=new ChatManager(); public static ChatManager getChatManager(){
return cm;
} //Vector 类可以实现可增长的对象数组
Vector<ChatSocket> vector=new Vector<ChatSocket>(); public void add(ChatSocket cs){
vector.add(cs);
} //发送信息
public void publish(ChatSocket cs,String out){
for(int i=;i<vector.size();i++){
ChatSocket csChatSocket =vector.get(i);
if(!cs.equals(csChatSocket)){
csChatSocket.out(out);
}
}
}
}
ChatSocket代码完善
public class ChatSocket extends Thread {
Socket socket;
public ChatSocket(Socket socket) {
super();
this.socket = socket;
}
//写数据
public void out(String out){
try {
socket.getOutputStream().write(out.getBytes("utf-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} //当前服务器不断地 读取 客户端传来的数据,把接受的数据传到Vector<ChatSocket>集合
public void run() {
try {
BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream(),"utf-8")); String line=null;
while((line=br.readLine())!=null){
ChatManager.getChatManager().publish(this, line);//this是当前线程
}
br.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} }
ServerListener 类
public class ServerListener extends Thread { public void run() {
try {
//服务器端的socket
ServerSocket serversocket=new ServerSocket();
while(true){
//收到客户端的socket,
Socket socket=serversocket.accept();
//建立连接
JOptionPane.showMessageDialog(null, "有客户端连接到本地的22345端口"); //将socket传递到新的线程(socket通信的线程)
ChatSocket cs=new ChatSocket(socket);
cs.start();
ChatManager.getChatManager().add(cs);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
测试代码同上,
效果如下
socket通信的更多相关文章
- 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?
这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...
- php简单实现socket通信
socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究一下在php里面如何实现sock ...
- Socket通信类
package com.imooc; import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- .NET开源高性能Socket通信中间件Helios介绍及演示
一:Helios是什么 Helios是一套高性能的Socket通信中间件,使用C#编写.Helios的开发受到Netty的启发,使用非阻塞的事件驱动模型架构来实现高并发高吞吐量.Helios为我们大大 ...
- iOS开发之Socket通信实战--Request请求数据包编码模块
实际上在iOS很多应用开发中,大部分用的网络通信都是http/https协议,除非有特殊的需求会用到Socket网络协议进行网络数 据传输,这时候在iOS客户端就需要很好的第三方CocoaAsyncS ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-简单例子-实现简单的服务端客户端消息应答
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
- AgileEAS.NET SOA 中间件平台.Net Socket通信框架-完整应用例子-在线聊天室系统-下载配置
一.AgileEAS.NET SOA中间件Socket/Tcp框架介绍 在文章AgileEAS.NET SOA 中间件平台Socket/Tcp通信框架介绍一文之中我们对AgileEAS.NET SOA ...
随机推荐
- PostgreSQL 允许远程访问设置方法
安装PostgreSQL数据库之后,默认是只接受本地访问连接.如果想在其他主机上访问PostgreSQL数据库服务器,就需要进行相应的配置. 配置远程连接PostgreSQL数据库的步骤很简单,只需 ...
- EasyuI comboxTree 使用笔记
继承至 $.fn.combo.defaults 和$.fn.tree.defaults.覆盖默认值$.fn.combotree.defaults. combotree结合选择控制和下拉树,类似于com ...
- 破解myEclipse
建立一个java项目,将reg.java放入,并且运行在控制台 输入账户 回车就会出现 序列号 菜单栏--->myeclipse-->substription information--- ...
- 12/13 Oracle连接报错
1.oracle连接错误the network adapter could not establish the connection参考:http://blog.sina.com.cn/s/blog_ ...
- dubbo配置
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常简单的模 ...
- 将input file的选择的文件清空的两种解决方案
<input type="file" id="fileupload" name="file" /> 上传文件时,选择了文件后想清 ...
- UE3名称结构(Name)
解释说明: (1) 直接通过FName的index进行比较来判断两个FName是否相等 (2) 通过FName的index从全局Names数组中取出对应的FNameEntry,可以获得FName的字符 ...
- 第三十二篇:在SOUI2.0中像android一样使用资源
SOUI2.0之前,在SOUI中使用资源通常是直接使用这个资源的name(一个字符串)来引用.使用字符串的好处在于字符串能够表达这个资源的意义,因此使用字符串也是现代UI引擎常用的方式. 尽管直接使用 ...
- 模板类 error LNK2019: 无法解析的外部符号
如果将类模板的声明和实现写在两个独立的文件中,在构建时会出现"error LNK2019: 无法解析的外部符号 "的错误. 解决方法有: 第一种方法,就是把类模板中成员函数的声明和 ...
- 【Android】一种提高Android应用进程存活率新方法
[Android]一种提高Android应用进程存活率新方法 SkySeraph Jun. 19st 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph ...