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 ...
随机推荐
- 切换debian8系统语言环境
想切换操作系统的默认语言环境,可以使用如下命令,而不用重新安装系统: 查看操作系统的语言: # env | grep LANG 使用root导入要使用的系统语言: # export LANG=en_U ...
- linux vim 插入行号
1 在文本中插入行号 最近有朋友提到某编辑器有一个可以插入行号的插件,问Vim有没有办法可以在文章中插入行号.%$^&*#8~#$@#!--让我们看一下有多少种方式可以在vim中插入行号或数字 ...
- Guidance of Set up FTP Server
Step 1. Create a FTP folder in your C disk, named "FTPReport"(an example) Step 2. Install ...
- 正则-RegExp()构造函数
上次写了js正则的字面量声明,今天说说RegExp()构造函数声明: var p=/cat/g; //字面量声明var p=new RegExp('cat','g') //构造函数声明 它两所表达 ...
- C and SQL data types for ODBC and CLI
C and SQL data types for ODBC and CLI This topic lists the C and SQL data types for ODBC and CLI a ...
- Linux创建定时任务
例如: 要求每天23:59分备份lampp日志: 备份的文件名以当时的时间命名 格式为:201612241852_acces.log 备份到:/tmp/logs/目录下 1.新建shell脚本:vim ...
- 用C#实现 查看exe所加载dll列表的功能
var p = System.Diagnostics. Process.GetProcessesByName("w3wp").First(); List<System.Dia ...
- ***Linux下使用git命令及github项目
在linux下搭建git环境1.创建Github账号,https://github.com2.Linux创建SSH密钥: ssh-keygen ##一直默认就可以了 3.将公钥加入到Github账户 ...
- wireshark使用方法总结
Wireshark基本用法 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接口. ...
- MSSQL2005后版本插入数据返回ID的新写法
例子: INSERT VolunteerSound_Table (Title,ArticleContent)OUTPUT Inserted.ID VALUES ('FirstVal','bbbbb') ...