简单的socket编程
1.socket 服务器搭建
实例化socket服务器,循环获取请求
package com.orange.util; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit; /**
* socket服务器
*
* @author Chengjq
*
*/
public class SocketServer { public static int count = 0; public static void main(String[] args) {
// TODO 自动生成的方法存根
int port = 4404;
// 首先直接创建serversocket
ServerSocket serverSocket = null;
Socket socket = null;
try {
serverSocket = new ServerSocket(port);
System.out.println("启动socketServer成功,等待客户端的连接");
while (true) {
socket = serverSocket.accept();
System.out.println("有新的客户端请求连接");
SocketThread st = new SocketThread(socket);
st.start();
ChatManager.getChatManager().add(st);
//启动定时任务,如果10s内没有进程
/*Runnable runnable = new Runnable() {
int clientNum = 0;
public void run() {
// task to run goes here
clientNum = ChatManager.getChatManager().vector.size();
System.out.println("剩余客户端数量:"+clientNum);
if(clientNum ==0 ){
System.out.println("连接超时,或者无客户端连接,关闭serverSocket");
//关闭socket
//.....
}
}
};
ScheduledExecutorService service = Executors
.newSingleThreadScheduledExecutor();
// 第二个参数为首次执行的延时时间,第三个参数为定时执行的间隔时间
service.scheduleAtFixedRate(runnable, 2, 10, TimeUnit.SECONDS); */
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
System.out.println("serverSocket已超时");
try {
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
} }
SocketThread类实现多线程通信
package com.orange.util; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; /**
* SocketThread实现多线程通信
*
* @author Administrator
*
*/
public class SocketThread extends Thread { ServerSocket serverSocket = null; Socket socket = null; public SocketThread(ServerSocket serverSocket,Socket socket) {
super();
this.serverSocket = serverSocket;
this.socket = socket;
} public SocketThread(Socket socket) {
super();
this.socket = socket;
} public void out(String out) {
try {
socket.getOutputStream().write(out.getBytes("utf-8"));
} catch (IOException e) {
e.printStackTrace();
}
} public void publish(String out){
ChatManager.getChatManager().publish(this, out);
} @Override
public void run() {
// TODO Auto-generated method stub
BufferedReader socketIn = null;
PrintWriter socketOut = null;
String inMess = null;
try {
socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socketOut = new PrintWriter(socket.getOutputStream());
while (true) {
inMess = socketIn.readLine();
publish(inMess);
if("bye".equals(inMess)){
ChatManager.getChatManager().remove(this);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
System.out.println("已结束当前会话");
socketOut.close();
socketIn.close();
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } }
单例Chatmanage,对所有客户端线程管控处理
package com.orange.util;
import java.util.Vector;
public class ChatManager {
// 实现单例化
private ChatManager() {
};
private static final ChatManager cm = new ChatManager();
public static ChatManager getChatManager() {// 返回值为ChatManager
return cm;
}
// 单例化完成
Vector<SocketThread> vector = new Vector<SocketThread>();
public void add(SocketThread st) {// 为当前集合添加SocketThread对象
vector.add(st);
}
public void remove(SocketThread st) {// 当前客户端关闭连接
vector.remove(st);
}
public void removeall() {// 关闭所有连接
for (int i = 0; i < vector.size(); i++) {// 遍历所有的线程
SocketThread csChatSocket = vector.get(i);
if(csChatSocket!=null){
vector.remove(csChatSocket);
}
}
}
// 某一个线程向其他的客户端发送信息
public void publish(SocketThread st, String out) {
for (int i = 0; i < vector.size(); i++) {// 遍历所有的线程
SocketThread csChatSocket = vector.get(i);
if (csChatSocket != st)// 判断不是当前线程就发送此消息
csChatSocket.out(out + "\n");
}
}
// 向当前线程发信息
public void publish_present(SocketThread st, String out) {
st.out(out + "\n");
}
}
至此,服务器搭建完成
2.客户端(创建两个客户端)
客户端1(监听指定服务器,通过控制台输入消息进行服务器与客户端以及客户端之间的通信,)
package com.orange; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; /**
* 客户端1
* @author Chengjq
*
*/
public class SocketClient1 { @SuppressWarnings("static-access")
public static void main(String[] args) {
try {
//初始化客户端
Socket socket = new Socket("127.0.0.1", 4404);
BufferedReader readline = new BufferedReader(new InputStreamReader(System.in));
//获取输出打印流
PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
String outTemp = null;
System.out.println("开始准备向服务器端发起请求---\n自己:");
// 已启动连接socket服务器,准备实时接收来自其他客户端的消息
GetMess getMess = new GetMess(socket);
getMess.start();
// 通过控制台发送消息给其他客户端,以“bye”为结束语
while ((outTemp = readline.readLine()) != null) {
//发送信息
socketOut.println(outTemp);
socketOut.flush();
if("bye".equals(outTemp)){
break;
}
}
getMess.currentThread().interrupt();
//依次关闭各种流
readline.close();
socketOut.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
客户端2
package com.orange; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class SocketClient2 {
@SuppressWarnings("static-access")
public static void main(String[] args) { try {
//初始化客户端
Socket socket = new Socket("127.0.0.1", 4404);
BufferedReader readline = new BufferedReader(new InputStreamReader(System.in));
//获取输出打印流
PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
String outTemp = null;
System.out.println("开始准备向服务器端发起请求---\n自己:");
// 已启动连接socket服务器,准备实时接收来自其他客户端的消息
GetMess getMess = new GetMess(socket);
getMess.start();
// 通过控制台发送消息给其他客户端,以“bye”为结束语
while ((outTemp = readline.readLine()) != null) {
//发送信息
socketOut.println(outTemp);
socketOut.flush();
if("bye".equals(outTemp)){
break;
}
}
getMess.currentThread().interrupt();
//依次关闭各种流
readline.close();
socketOut.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
GetMess(多线程处理获取其他客户端的消息并且展示)
package com.orange; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket; public class GetMess extends Thread { Socket socket = null; public GetMess(Socket socket) {
super();
this.socket = socket;
} @Override
public void run() {
// TODO Auto-generated method stub
BufferedReader socketIn = null;
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
socketIn = new BufferedReader(isr);
String inTemp = null;
while(true){
inTemp = socketIn.readLine();
if(inTemp != null && !"bye".equals(inTemp) ){
System.out.println("好友:\n"+inTemp);
}else{
System.out.println("好友:\n已下线,关闭当前回话");
break;
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
Thread.currentThread().interrupt();
socketIn.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } }
ok,简单的sockte服务与客户端完成了
先启动server
在分别启动client




输入结束bye,关闭当前会话

简单的socket编程的更多相关文章
- linux网络编程1 最简单的socket编程
下面是socket编程的服务器端 先看一个图,1 #include<stdio.h> #include<stdlib.h> #include<string.h> # ...
- python 简单的Socket编程
python 编写server的步骤: 1第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket(family, type ) family参数代表 ...
- Java 简单的 socket 编程入门实战
这个是给女朋友写的:) 首先需要知道我们每个电脑都可以成为server(服务器) 和 client(客户端) 我们需要使用java来实现客户端与服务器的数据传输 先帖上代码 注意这里两张代码处于两个j ...
- Linux Socket编程
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- Linux Socket编程(不限Linux)【转】
转自:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html “一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几 ...
- SOCKet 编程 简介
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- Linux Socket编程(不限Linux)
"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信 ...
- socket编程(Linux)
“一切皆Socket!” 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. ——有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览 ...
- socket编程:客户端与服务器间的连接以及各函数的用法
在认真的看UNP之前,一直被socket编程说的云里雾里,今天我要让大家从整天上认识socket编程,让我们知道socket编程的整个流程和各个函数的用法.这样:我们在写一些简单的socket编程时就 ...
随机推荐
- 38. CentOS-6.3安装配置Tomcat-7
安装说明 安装环境:CentOS-6.3安装方式:源码安装 软件:apache-tomcat-7.0.29.tar.gz下载地址:http://tomcat.apache.org/download-7 ...
- docker学习笔记 参考
https://www.cnblogs.com/YDDMAX/p/6045079.html 参考此人播客:docker 分类 http://www.cnblogs.com/51kata/categor ...
- json小知识
json转换新方法 上面是把一个json数组转换成map集合 fromObject()是通用的 map集合,bean对象,String转换成json 文件转换成字符串,在转换成json 生成json文 ...
- 使用.htaccess文件
禁止对无索引文件的目录进行文件列表展示 默认情况下,当我们访问网站的某个无索引文件(如index.html,index.htm或 index.php)目录时,服务器会显示该目录的文件和子目录列表,这是 ...
- SpringMvc 获取ApplicationContext
有时,我们不通过Controller层进入Service层,比如同步数据,任务,以及文件上传共通Handler对文件处理后保存数据等都会由一个非Controller类调用Service. 这时候如果n ...
- UI5-文档-4.38-Accessibility
作为本教程的最后一步,我们将改进应用程序的可访问性. 为此,我们将添加ARIA属性.屏幕阅读器使用ARIA属性识别应用程序结构并正确解释UI元素.通过这种方式,我们可以让我们的应用程序对那些使用电脑有 ...
- map模块使用方法
map指令使用ngx_http_map_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_map_module.ngx_http_map_modu ...
- 四大域对象,和jsp的九大隐式对象,已经el表达式的11个隐式对象
四大域对象 1.PageContext :页面范围的数据 2.ServletRequest:请求范围的数据 3.HttpSession:回话范围的数据 4.ServletContext:应用范围的数据 ...
- 微擎系统 微信支付 get_brand_wcpay_request:fail
支付授权目录问题,有一个是域名加app的
- Spring工作原理与单例
最近看到spring管理的bean为单例的,当它与web容器整合的时候始终搞不太清除,就网上搜索写资料, Tomcat与多线程, servlet是多线程执行的,多线程是容器提供的能力. servlet ...