java Socket实例

时间:2022-06-11 04:11:18

可以实现客户端与服务端双向通信,支持多客户端连接,客户端断开连接,服务端不会出现异常

服务端代码:

package com.thinkgem.jeesite.modules.socketTest.demo1;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; /**
* @Author: zhouhe
* @Date: 2019/4/10 16:56
*/
public class Server { private static class ClientHandler implements Runnable { private Socket socket; public ClientHandler(Socket socket) {
this.socket = socket;
} @Override
public void run() {
try {
//封装输入流(接收客户端的流)
BufferedInputStream bis = new BufferedInputStream(
socket.getInputStream());
DataInputStream dis = new DataInputStream(bis);
byte[] bytes = new byte[1]; // 一次读取一个byte System.out.println("bytes:"+bytesToHexString(bytes)); String ret = "";
while (dis.read(bytes) != -1) {
ret += bytesToHexString(bytes) + "";
if (dis.available() == 0) { //一个请求
System.out.println(socket.getRemoteSocketAddress() + ":" + ret);
System.out.println("转换为字符串后:"+hexStringToString(ret));
ret = "";
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("client is over");
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
} /**
* byte[]数组转换为16进制的字符串
*
* @param bytes 要转换的字节数组
* @return 转换后的结果
*/
public static String bytesToHexString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < bytes.length; i++) {
String hex = Integer.toHexString(0xFF & bytes[i]);
if (hex.length() == 1) {
sb.append('0');
}
sb.append(hex);
}
return sb.toString();
} /**
* 16进制转换成为string类型字符串
* 这个方法中文会乱码,字母和数字都不会乱码
*
* @Author zhouhe
* @param s
* @return
*/
public static String hexStringToString(String s) {
if (s == null || s.equals("")) {
return null;
}
s = s.replace(" ", "");
byte[] baKeyword = new byte[s.length() / 2];
for (int i = 0; i < baKeyword.length; i++) {
try {
baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));
} catch (Exception e) {
e.printStackTrace();
}
}
try {
s = new String(baKeyword, "UTF-8");
new String();
} catch (Exception e1) {
e1.printStackTrace();
}
return s;
} //测试方法
public static void main(String[] args) {
ServerSocket server = null;
try {
server = new ServerSocket(10010);
while (true) {
System.out.println("listening..."); Socket socket = server.accept();
System.out.println("连接客户端地址:" + socket.getRemoteSocketAddress());
System.out.println("connected...");
ClientHandler handler = new ClientHandler(socket);
Thread t = new Thread(handler);
t.start(); }
} catch (Exception e) {
e.printStackTrace();
} finally {
if (server != null) {
try {
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

客户端代码:

package com.thinkgem.jeesite.modules.socketTest.demo1;

import java.io.OutputStream;
import java.math.BigInteger;
import java.net.Socket;
import java.util.Scanner; /**
* @Author: zhouhe
* @Date: 2019/4/10 16:55
*/
public class Client {
public static void main(String[] args) { //TODO 16进制 转换为10进制
//String str = new BigInteger("01 10 00 00 00 02 04 00 01 00 00 a2 6f", 16).toString(10);
//System.out.println(str); Socket socket = null;
try {
System.out.println("connecting...");
socket = new Socket("127.0.0.1", 12888);
System.out.println("connection success"); // 输入任意字符发送,输入q退出
Scanner in = new Scanner(System.in);
String str = "01 10 00 00 00 02 04 00 01 00 00 a2 6f"; //发送的16进制字符串
byte[] bytes = hexStringToByteArray(str);
OutputStream os = socket.getOutputStream();
while (!(in.nextLine()).equals("q")) { //输入q退出
os.write(bytes);
}
os.close(); } catch (Exception e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (Exception e) { }
}
}
} /**
* 16进制表示的字符串转换为字节数组
*
* @param hexString 16进制表示的字符串
* @return byte[] 字节数组
*/
public static byte[] hexStringToByteArray(String hexString) {
hexString = hexString.replaceAll(" ", "");
int len = hexString.length();
byte[] bytes = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
// 两位一组,表示一个字节,把这样表示的16进制字符串,还原成一个字节
bytes[i / 2] = (byte) ((Character.digit(hexString.charAt(i), 16) << 4) + Character
.digit(hexString.charAt(i + 1), 16));
}
return bytes;
}
}

java Socket实例的更多相关文章

  1. TCP&sol;UDP套接字 java socket编程实例

    网络协议七层结构: 什么是Socket? socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口.使用socket编程也称为网络编程,socket只是接口并不是网络通信协议. ...

  2. java socket编程实例代码

    1.所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 两性话题 两性 ...

  3. java tcp socket实例

    java tcp socket实例 2011-04-20 13:58 2364人阅读 评论(1) 收藏 举报 socketjavatcpthreadserverclass package com.ne ...

  4. Flex Socket与Java通信实例说明(转)

    Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...

  5. JAVA通信系列一:Java Socket技术总结

    本文是学习java Socket整理的资料,供参考. 1       Socket通信原理 1.1     ISO七层模型 1.2     TCP/IP五层模型 应用层相当于OSI中的会话层,表示层, ...

  6. JAVA Socket 编程学习笔记(一)

    1. Socket 通信简介及模型 Java Socket 可实现客户端--服务器间的双向实时通信.java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的cli ...

  7. JAVA Socket超时浅析

    JAVA Socket超时浅析 套接字或插座(socket)是一种软件形式的抽象,用于表达两台机器间一个连接的"终端".针对一个特定的连接,每台机器上都有一个"套接字&q ...

  8. 循序渐进Java Socket网络编程(多客户端、信息共享、文件传输)

    目录[-] 一.TCP/IP协议 二.TCP与UDP 三.Socket是什么 四.Java中的Socket 五.基本的Client/Server程序 六.多客户端连接服务器 七.信息共享 八.文件传输 ...

  9. Java基础:三步学会Java Socket编程

    Java基础:三步学会Java Socket编程 http://tech.163.com 2006-04-10 09:17:18 来源: java-cn 网友评论11 条 论坛        第一步 ...

随机推荐

  1. &lbrack;转&rsqb;extjs render 用法介绍

    renderer可以格式化该列显示的数据格式或者按照你自定义的脚本显示最终数据样子,个人是这么理解,如果你不是可以看下本文 复制代码 代码如下: var cm = new Ext.grid.Colum ...

  2. Backbone源码阅读手记

    Backbone.js是前端的MVC框架,它通过提供模型Models.集合Collection.视图Veiew赋予了Web应用程序分层结构.从源码中可以知道,Backbone主要分了以下几个模块: ( ...

  3. sql FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

  4. Shell的概念

    Linux系统分为三个重要部分: 1:kernel(核心) 2:Shell 3:应用程序和工具

  5. Eclipse 下载与安装(2014&period;12&period;26——by小赞)

    Eclipse网站首页:http://www.eclipse.org/home/index.php Eclipse下载页网址:http://www.eclipse.org/downloads/ 步骤一 ...

  6. (入门篇 NettyNIO开发指南)第五章-分隔符和定长解码器使用

    TCP    以流的方式进行数据传输上层的应用协议为了对消息进行区分,往往采用如下4种方式. (1)消息长度固定,累计读取到长度总和为定长LEN 的报文后,就认为读取到了一个完整的消息,将计数器置位, ...

  7. thymeleaf文本处理

    文本处理 显示文本是网页开发的最基本需求,另外,国际化的程序当今也是相当必要的.这些问题,thymeleaf都可以轻松解决. th:text标签属性 这个属性的基本作用就是显示文本,它的值可以既可以从 ...

  8. &lpar;转&rpar;SQL中的循环、for循环、游标

    我们使用SQL语句处理数据时,可能会碰到一些需要循环遍历某个表并对其进行相应的操作(添加.修改.删除),这时我们就需要用到咱们在编程中常常用的for或foreach,但是在SQL中写循环往往显得那么吃 ...

  9. nginx 日志分析工具goaccess

    参考:https://www.goaccess.io/download 安装 $ wget http://tar.goaccess.io/goaccess-1.1.1.tar.gz $ tar -xz ...

  10. 使用Asp&period;Net Core MVC 开发项目实践&lbrack;第四篇&colon;基于EF Core的扩展2&rsqb;

    上篇我们说到了基于EFCore的基础扩展,这篇我们讲解下基于实体结合拉姆达表达式的自定义更新以及删除数据. 先说下原理:其实通过实体以及拉姆达表达式生成SQL语句去执行 第一种更新扩展: 自定义更新字 ...