600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Java:socket服务端 socket服务端支持多连接 socket客户端 socket客户端支持发送和接受

Java:socket服务端 socket服务端支持多连接 socket客户端 socket客户端支持发送和接受

时间:2023-12-28 15:34:31

相关推荐

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));

现在这个客户端,可以接收,可以发送

运行一下

这面收到的数据

然后我回复几句话

这面接收到

(记得网络调试助手和服务端的端口号要一样)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。