Java 服务端和客户端的通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 服务端和客户端的通信相关的知识,希望对你有一定的参考价值。

服务端和客户端互发消息,互发文件。我在线程中用while(true)接收消息,文件的。然后各种情况,不是文件数据丢失,就是读取文件时阻塞,或者就是消息和文件的数据合在一起。求大佬帮帮忙,怎么解决消息和文件读取之间的冲突

有两种方法:

    客户端和服务端创建两个连接,一个连接用于发消息,一个连接用于发文件。

    客户端和服务端使用同一个连接,数据不要直接发出去,按照一定的格式制订一个协议,数据一块一块的发,每块前面加上块类型和长度,类型表明发送的是消息数据还是文件数据。

追问

能给我讲讲第二种么,第一种大概都明白。这两种方法我也在网上看到过。第二种说的协议这种概念有点模糊。我的代码是这样的,以http80:开头的说明是消息,以http89:开头的说明是文件。这样虽然能解决文件和消息之间的冲突,但文件好像因为没有关闭流老是发生数据丢失,导致接受到的文件是损坏的

追答

光加这个头是不行的,还要加一个发送的数据长度,不然你不知道发送的消息或者文件数据何时结束,这样消息和文件数据就会混一起。

追问

大佬可以帮帮我嘛。我还是不行,今天又弄了一天。要崩溃了

参考技术A //客户端
package 通讯;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class client
public static void main(String[] args)
try
Socket socket = new Socket("127.0.0.1", 8885);
while (true)  //死循环重复步骤
OutputStream os = socket.getOutputStream();
PrintStream bw = new PrintStream(os);
Scanner input = new Scanner(System.in);
System.out.println("你想对对面的服务器说些什么");
bw.print(input.next());//从键盘输入读取一行 打印到输出流
bw.flush();
socket.shutdownOutput();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String s;
while ((s = br.readLine()) != null)
System.out.println("服务器端说:" + s);

socket.shutdownInput();
br.close();
isr.close();
is.close();
bw.close();
os.close();

catch (IOException e)
e.printStackTrace();

怎么用SSH登陆OpenWrt,服务端和客户端的设置方法

参考技术A 公司有一台2017年的新路由3退役了,下放到我的手上,我又多了个新玩具。

这货被攻城狮同事刷成了OpenWrt固件,不懂还想折腾就得去找教程。一看网上的教程大多都是以命令行操作的,命令行在哪里呢?

原来,OpenWrt的内核是Linux,原生版本是没有图形界面的,我手上这台路由器因为安装了LuCI所以才有图形界面。通过SSH登陆OpenWrt就能看得到命令行了。

记录一下怎么用SSH登陆OpenWrt,对服务端和客户端分别进行设置。

路由器刷好OpenWrt固件并安装LuCI

通畅的局域网

一台Mac或Windows电脑

OpenWrt版本:OpenWrt 19.07-SNAPSHOT / LuCI 18.06 Lienol (git-ed5893a)

电脑系统:Windows 10

路由器IP为默认,即192.168.1.1

用Wifi或网线接入路由器,打开网页浏览器访问路由器的IP。

登陆到路由器后台页面,在 系统 下拉菜单中点击 管理权 。

在管理权页面中进行以下设置:

PS:如果需要更高的安全性,建议设置密钥。用SSH客户端软件生成一对公钥和私钥,把公钥粘贴到下面的文本框里就行了。

最后点击 保存并应用 。

任意SSH客户端软件都可以,我用的是Xshell 6。

运行软件后点击 新建 ,在弹出窗口中填写:

名称随意,协议SSH,主机填路器IP地址,端口号填前面记下来那个。然后填写登陆用户名和密码:

照图填写,密码用路由器管理员密码即可。

PS:采用密钥验证的要在“方法”中选择Public key,“用户密钥”处选择之前生成的密钥对,“密码”填生成密钥时设置的密码。

设置完后点击连接。

出现LOGO和命令提示符,说明SSH登陆OpenWrt成功。

以上是关于Java 服务端和客户端的通信的主要内容,如果未能解决你的问题,请参考以下文章

使用WebSocket实现服务端和客户端的通信

c#UDP聊天程序,关于服务端和客户端的功能!急!!!!

PHP的Socket怎么进行服务端与客户端的相互通信?

怎么用SSH登陆OpenWrt,服务端和客户端的设置方法

Java 网络编程

Socket通信中服务端如何响应大规模的客户端请求