推广 热搜: csgo  vue  angelababy  2023  gps  新车  htc  落地  app  p2p 

Socket编写一个简易的聊天室(相关知识点的总结)

   2023-08-21 网络整理佚名1660
核心提示:这些简单的硬件知识,对于程序员来说不算什么。第二步:知道了简单构建模型,可以按照需求进行开发。在根据相关的IO知识编写程序。通过类来完成相应的客户端编写,要与服务端通信,第一步就是把端口号对应上,并且把服务器的地址写上。因为涉及到相应的读写操作,集合次之,集合是存放聊天室的成员的。(个人理解,因为聊天程序还包括私聊功能,多个用户共同操作一个服务器)。

当我第一次接触它时,我以为它是网络编程部分。学了之后,我发现他也是Java的一门课。只是它与TCP协议挂钩。在使用网络和协议问题,以及每个应用的对应端口时,当服务器或客服通过网络接收到信息时,会先根据IP地址找到对应的位置,然后通过端口检索应用。在DOS窗口下输入相应的网络信息。网关,顾名思义,就是网络门。当您链接路由器时,它是一个网关。IPV4:您的计算机地址如下。这些简单的硬件知识对程序员来说不算什么。对于七层协议,没有太多的描述,百度有。只需说出它在哪里。应用程序-传输-网络-物理(在应用程序和传输层之间)。

让我们进入正题,如何用它编写聊天程序。

第 1 步:聊天必须在两个或更多人之间进行,因此应用程序应包含客户端和服务器端口。客户端将相关信息写入服务器。(当然,这是基于网络已经连接的前提下,至于如何连接,后面会继续描述)。服务器相当于服务器,用于处理数据。

如图所示是一个简单的聊天模型。客户端可以将相关数据写入服务器,当然服务器也可以向客户端发送一些数据,这是互连的。

第二步:了解简单的施工模型,就可以根据需要进行开发。第一种是写服务器,只要服务器在服务器启动时能得到客户端的地址,两者就可以建立通信,这就需要使用Socke中的相关方法。首先是定义相关端口。如下图所示,这是一种在端口中传递的构造方法。整数类型。这就像定义未使用的端口一样简单。例如,定义 1 = 新 (8000);我们通过其对象调用相关方法。通过调用 ();接受代理发送的端口信息。 = .();这句话的意思是接受类的变量。这个变量可以称为chat();方法。与服务程序相比,读写客户端的输入信息应使用输入流,即。根据相关的IO知识编写程序。(在编写程序时,应该比较更多的 API 文档,总共只有这两个类,其中的方法并不多。)

步骤3:写入相应的服务器。下一步是编写客户端

要通过类完成对应的客户端写入,与服务器通信的第一步是对应端口号,写入服务器的地址。 final = new (“192.168.1.107”, 8000);请注意,端口号对应于端口号。否则,它将无法连接。连接好这个连接后,剩下的就是逻辑问题,可以慢慢解决。在这两个类中,还有自由相关的方法和属性。这根据业务需求而增加。

第 4 步:开发这样一个简单的聊天工具所使用的知识的初步估计是:异常、IO 流、集合、多线程、面向对象的基本思想、类使用。最常用的是 IO 流。因为涉及到对应的读写操作,所以集合是第二个,集合是聊天室的成员。建议使用映射值对的集合。当然,不用说,IO端口肯定会引发异常。如果你真的能认真地编写这个程序,那么Java的基础部分就可以毕业了。(我个人理解,因为聊天程序还包括私人聊天功能,多个用户共同操作单个服务器)。经过不懈努力,解决问题后终于完成了基础功能,输入用户名作为用户注册,就可以通过@xxx lll与某人私聊,即别人看不到你们之间的聊天记录。

第五步:总结开发过程中遇到的一些问题,即解决方案。

1:当客户端输入一行文本时,发现服务器没有响应,搜索的各个方面都没有问题。后来发现打印输出中的句子在外面尝试。这意味着服务器一直在监听客户端的信息,等待客服输入结束,但这是一个无限循环,无法结束,所以一直无法跳出这个范围,也无法显示信息,然后将句子移到括号内完成。它以红色显示,如下图所示。

try {
ClientsManager cm = new ClientsManager();
cm.addClient(socket);
input = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(input, "utf-8"));
String msg;
while (null != (msg = br.readLine())) {
System.out.println(msg);
}

2.当一个客户端有连接时,你会发现其他客户端无法连接...怎么了?问题出在 main 方法内部,该方法从上到下执行,是一个线程。当其他用户连接时,无法再次执行该线程。解决这个问题的方法是创建一个新线程,执行时,多个线程一起执行而不会相互干扰。

new Thread(new Runnable() {
public void run() {
try {
writeMsg(socket);
} catch(Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
public void run() {
readMsg(socket);
}
}).start();

如红色代码所示。使用匿名内部类 new(){} 创建一个新线程来创建一个实例。运行();该方法执行对服务器的写入。();是读取服务器的操作。

3:

上报异常时,如图所示,异常是并发的。代码不渲染,上图所示为解决方法,此并发异常是指遍历集合时删除集合的操作,使用不是迭代器,系统默认为并发修改异常,然后报错。为什么删除它,因为用户在完成键入时关闭,并且在关闭时需要将其删除。防止系统报告错误。处理并发问题时,使用锁。锁定对象是没有用的,必须锁定字节码。并使用特定于迭代器的 ();删除它的方法。

由于

时间有限,细节太多要写,简单写在这里,源码可以参考以下URL(个人代码库,采用SVNG管理)。

 
标签: socket通信
反对 0举报 0 收藏 0 打赏 0评论 0
 
更多>同类资讯
推荐图文
推荐资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报
Powered By DESTOON