Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受
一、Java之socket服务端
新建一个Java工程
命名
给他先创建一个类
在类里面我们做一个main
这里面也需要,创建套接字,IP号,端口号
但是java中有一个类 ServerSocket,
你在实例化 ServerSocket 的时候,
带一个整型数的构造方法,这个就是端口号
我们把端口号设置为8801,
这样子就把以前的繁杂的配置结束了
这面波浪线的意思,我们按下ctrl + 1
这面波浪线的意思,我们按下ctrl + 1
这面波浪线的意思,我们按下ctrl + 1
这面需要try catch ,因为他可能会出错
他可能产生一个io 异常,网络连接可能产生一个受查异常
对于受查异常,我们必须处理,要不然它编译通不过
我们做一个调试
回忆一下我们是如何连接的
,socket对象里面有一个accept
当你能够走到这一步的时候 socket.accept();
就说明有客户端连接上来了
可以加一句 System.out.println("有客户端接入"); 第14行
有客户端接入的时候,我们一定要进行通信
所以这个连接通道我们要给他留着 Socket con = socket.accept(); 第13行
也就是说accept的返回值,我们要给他拿出手
Socket 第13行不认识 ,我们CTRL + shirt + o 打包
接下来我们就是读取数据
这个连接通道里面我们可以 con.getInputStream(); 获取输入流,用来读取数据
这个输入流的返回值是什么呢? InputStream in =con.getInputStream(); 这个流我们要给他拿到手,拿到手就可以读取数据
我们要把读取的数据放在byte里面
然后要在main 里面做一个数组 byte[] data = new byte[128];
读取到数据以后,我们还得输出
System.out.println("读到消息:"+new String(data)); 第22行
运行一下
显示套接字创建成功
然后打开我们的网络调试助手
先修改一下协议类型
端口号改一下
点击一下连接,然后这面就显示 有客户端接入
发送一句话
另一面接受到的
后面有一堆乱码
这些乱码的原因是因为 byte[] data = new byte[128]; data128个字节 没有初始化
我们通过data构建字符串的时候 System.out.println("读到消息:"+new String(data)); 可以把没用的地方去掉
read 它的返回值是一个整形数 in.read(data);
到底读了多少个,内容是可以获得的 int len = 0; len 的初始值我们给他弄成0
可以把 read 的返回值放在 len里面来
System.out.println("读到消息:"+new String(arg0, arg1, arg2));
第一个参数就是我们要转化的data ,从哪里开始 ,从第byte 里面0个字节开始 ,一直到 len
在运行一下
这面显示有客户端接入
在发送一下 bingtanglizi 这句话
结果
但是这样有个弊端,我发送一次以后,
程序就结束了
未结束的情况(有个红色的)
按照以前我们的经验,需要创建线程
这节课的思路: ServerSocket这个类,这个类创造连接以后调用accept
然后连接通道里面有一个 getInputStream();
这个输入流里面有一个read API 来读取函数
消息读出来的时候,我们要做一个byte到字符串的转换 System.out.println("读到消息:"+new String(data, 0, len));
二、Java之socket服务端支持多连接
上面有一个弊端,我们客户端还没断开,服务端就先断开了
根据以前的经验,当有客户端介入的时候,我们可以创建一个子线程对接
那么accept 这面可以来一个 while 循环
不断的连接,当有客户端新接入的时候
开辟一个线程对接 new Thread().start();
那 Thread 里面要干活是不是
你要干的活 InputStream in =con.getInputStream();//获取输入流,用来读取数据
len = in.read(data);
System.out.println("读到消息:"+new String(data, 0, len));
要放在
我们要做的是con不能报错,让这个Len不能报错
我们先把 int len = 0; 搞到
因为 try catch 以后会改变变量的作用域
然后解决data作用域的问题
con 这面有一个解决方案
final Socket con = socket.accept();
我们把鼠标放在波浪线上面,还有解决方案
点击
因为获取输入流,用来获取数据的时候,在线程里面可能会产生一些异常
所以我们把 int len = 0;
byte[] data = new byte[128];
len = in.read(data);
System.out.println("读到消息:"+new String(data, 0, len));
放到try那面
看一下思路
main函数一进来的时候,我们就创建一个套接字
· ServerSocket socket = new ServerSocket(8802);
System.out.println("socket套接字创建成功,等待连接");
套接字创建成功,我们死循环的接受客户端的接入,一但有客户端接入的时候呢,我们创建一个线程来对接,这样我就又回到循环的部分,等待客户端的接入,又有接入又要读
运行一下
只能一次发送一条消息
想连续发就点击断开,再点击连接,一次只能发送一次
因为我一个客户端连接读完以后,
其实单连接的线程·
public void run() {
// TODO Auto-generated method stub
InputStream in;
try {
in = con.getInputStream();
int len = 0;
byte[] data = new byte[128];
len = in.read(data);
System.out.println("读到消息:"+new String(data, 0, len));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//获取输入流,用来读取数据
他已经结束了,(不让他永久的连接)
三、Java之socket客户端
新建一个工程来写一下,这个客户端到后面要整到androidAPP当中去
然后
起个名字
完成
选择这个构造方法
第一个是Ip地址,第二个是端口号
IP地址是 "192.168.70.1",端口号是 8801。
波浪线 这面需要try catch
变成这样
要进行异常的捕获
既然有个io 总异常捕获的话、
catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
这个可以去掉
catch 一个大的异常就ok了
现在就是连接上了
连接上如何发送数据呢?
同样的 接收数据是InputStream
发送数据就是 client.getOutputStream();
它的返回值就是 OutputStream
OutputStream out = client.getOutputStream(); 这样我们就获得了一个向外输出的通道
那向外输出,我们要输出什么数据呢? Scanner sc = new Scanner(arg0) ;
,到时候这面的东西是Android App ,是设置好的
,我们这面模拟的话,用键盘输入 Scanner sc = new Scanner(System.in);
获取一个字符串用 String message = sc.next();
字符串有了以后,我们是不是还要往外面发呀
我们要把我们获得的string 转化成 byte
它的返回值就是btye 这样的一个数组
然后我们把服务端和客户端运行一下
服务端完整的代码
运行一下服务端,创建成功
轮到客户端了
端口被占用
改一下端口号在运行
我们这面需要去找一找,是哪个终端
找到以后,打出hello world 然后按一下回车
下面就会显示
这里面要注意next(); 空格会隔断
我们还是用网络助手来试一下
发送过去,发现空格后面没了
四、java 之 socket 客户端支持发送和接收
那我客户端和服务端已经能通信了,但是客户端只能发,也可以收
这个out是我们的发送通道,他从client这面获得
OutputStream out = client.getOutputStream(); //获得数据发送通道
获得数据接收通道 client.getInputStream();
那么我如何接收数据呢?
int len;
byte[] data = new byte[128];
通过getInputStream();的返回值
InputStream in =client.getInputStream();//获得数据接收通道、
读到data里面来
in.read(data);
读了多少 len = in.read(data);
System.out.println("获得服务端返回数据是:"+new String(data,0, len));
现在这个客户端,可以接收,可以发送
运行一下
这面收到的数据
然后我回复几句话
这面接收到
(记得网络调试助手和服务端的端口号要一样)
Java:socket服务端,socket服务端支持多连接,socket客户端,socket客户端支持发送和接受相关推荐
- linux服务篇-Xinetd服务
Xinetd=eXtended InterNET services daemon(扩展互联网服务守护进程=超级互联网守护进程=超级服务),xinetd是新一代的网络守护进程服务程序,又叫超级Inter ...
- Android 客户端Socket 与 Java服务端ServerSocket
Socket编程 一.Java网络编程基础知识 1.两台计算机间进行通讯需要以下三个条件: 1). IP地址(例如 : 192.168.1.1) 2). 协议(服务端与客户端之间双方自行 ...
- Socket实现java服务端与AndroidApp端数据交互
在这里主要想实现服务端向App端推送消息,所以采用了Socket. java端: 第一步:创建ServerSocketManager.java类,这个类是针对客户端和App端的连接和断开进行监听,读取 ...
- Java中利用socket实现简单的服务端与客户端的通信(中级)——实现任意双向通信
本文计划采用socket实现客户端和服务端的任意双向通信,即客户端可以随时给服务端发消息,服务端也可以随时给客户端发消息,最终结果就是一个类似与QQ的聊天软件的功能. 以下代码可以直接拷贝到Eclip ...
- Java中利用socket实现简单的服务端与客户端的通信(基础级)
在上一篇文章中,简单的介绍了java中入门级的socket编程,简单的实现了客户端像服务器端发送数据,服务器端将数据接收并显示在控制台,没有涉及多线程.上一篇文章的链接:Java中利用socket实现 ...
- Java中利用socket实现简单的服务端与客户端的通信(入门级)
Java编程中,要想要使用网络通信,就离不开Socket编程,在此对socket进行简单的介绍.首先声明,这是一个入门级的介绍,仅仅简单的实现了客户端向服务端发送数据,服务端正常的接收数据,当接收到特 ...
- java socket重连_Java客户端Socket在服务端重启后的异常情况处理
碰到场景如下:Java服务器端A(使用NIO的异步IO方式),Java客户端B(使用普通IO的同步方式),在服务端A重启后,B->A的Socket毫无疑问的断了,然后就会出现一些异常情况,分析一 ...
- 基于Spring 4.0 的 Web Socket 聊天室/游戏服务端简单架构
跟webservice来相比,Web Socket可以做到保持长连接,或者说强连接,一直握手存在两端可以互相发送消息互相收到消息,而webservice是一次性的,你要我响应就必须要请求我一次(黄盖: ...
- socket编程 -- epoll模型服务端/客户端通信的实现
https://blog.csdn.net/y396397735/article/details/50680359 本例实现如下功能: 支持多客户端与一个服务端进行通信,客户端给服务端发送字符串数据, ...
最新文章
- android 8.0以后(sdk26)启动前台服务的问题探究
- 华为云部署html网页,手把手教你如何在华为云服务器上部署一个自己的弹幕网站!...
- HTML 静态网页制作12月2日表单样式
- Java笔记-JNI中简单的参数与返回值处理
- 吐血整理,2021年最新【阿里、头条、美团】【软件测试】面试题(持续更新!)
- java if 并列_Java 并列if语句,一个判断失败后,后面的if就不执行了,为什么啊?...
- [SCOI2003]严格N元树
- ubuntu 14.04 编译yocto源码--环境配置篇
- vb与php通讯加密,在VB.NET中加密和在PHP中解密
- 怎么找到安装在Linux系统中的Windows软件的文件
- 硬件设计——DC-DC转换器
- php过滤特殊表情符号
- 腾讯安全御见威胁情报中心截获粗鲁的矿工,三种方式猛攻企业网络
- 常用数据库URL地址的写法
- Java基础恶补——内存泄露、内存溢出
- android颜体_颜体楷书结构的四大特征与特点
- Ubuntu系统如何用网线连上路由器上网
- 洛谷 P1423 小玉在游泳 AC
- OpenCV将BGR转换为NV12
- 【短信插件】JSHOP_V2.4系统短信功能对接流程