简单的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编程时就 ...
随机推荐
- Alpha版本检测报告
1.Alpha版本测试报告 发布一篇随笔,作为项目的测试报告,内容包括: (1)测试计划 测试人员 工作安排 覃一霸 编写测试报告 张江波 执行测试.截图测试结果 测试功能 功能 描述 效果 结果 登 ...
- HTML5 Canvas ( 填充图形的绘制 ) closePath, fillStyle, fill
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 数学公式 AS3应用
普通做法: var pA:Point=new Point(100,100); var pB:Point=new Point(300,200); var dx:Number=pA.x-pB.x; var ...
- 基于HttpClient的HttpUtils(后台访问URL)
最近做在线支付时遇到需要以后台方式访问URL并获取其返回的数据的问题,在网络上g了一把,发现在常用的还是Apache的HttpClient.因为以经常要用到的原故,因此我对其进行了一些简单的封装,在此 ...
- clientdataset 用法
http://www.360doc.com/content/10/0709/01/2071424_37769962.shtml
- Maven的配置以及IDEA导入本地Maven
1.首先看你的电脑jdk的环境变量是否配成功 2.Maven的下载地址:http://maven.apache.org/download.cgi 3.下载完成后解压到你要安装的目录,我的是直接放在D: ...
- liblas 1.8.1编译安装
liblas https://github.com/libLAS/libLAS/issues/102 https://liblas.org/start.html 源码 https://github.c ...
- nginx-----惹不起的端口修改
1,查看端口是否被占用 打开CMD,输入输入netstat -aon | findstr :80 出现: TCP 0.0.0.0:80 0.0.0.0:0 ...
- Away3D 学习笔记(一): 加载3DS格式的模型文件
加载外部的3DS文件分为两种: 1: 模型与贴图独立于程序的,也就是从外部的文件夹中读取 private function load3DSFile():Loader3D { loader = new ...
- oozie错误:javax.servlet.jsp.el.ELException: variable [***] cannot be resolved
完整错误: javax.servlet.jsp.el.ELException: variable [compute] cannot be resolved at org.apache.oozie.ut ...