JAVA Scoket编了个小程序,想实现聊天室功能。可以一方连续发送消息,另一方同样可以联系发送消息

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA Scoket编了个小程序,想实现聊天室功能。可以一方连续发送消息,另一方同样可以联系发送消息相关的知识,希望对你有一定的参考价值。

现在能实现的是A可以发送给B,B可以发送给A,但是如果A要继续发送的话只能等B发送过来,代码如下
服务端
import java.net.*;
import java.io.*;
import java.util.*;
public class Host
public static void main(String []args)
try
ServerSocket shost = new ServerSocket(5600);
System.out.println("服务器于端口 "+ shost.getLocalPort() + "启动!");
Socket connection = shost.accept();
System.out.println("客户端已连接!");
InputStream inStream = connection.getInputStream();
OutputStream outStream = connection.getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true);
Scanner scan = new Scanner(System.in);
String line1 = " ";
while(true)

String line = in.nextLine();
System.out.println("客户端:" + line);
if(line.equalsIgnoreCase(".quit"))
System.out.println("连接已断开");
break;

line1 = scan.nextLine();
out.println(line1);

in.close();
out.close();
connection.close();
shost.close();

catch(IOException ioe)

System.err.println("Error:" + ioe);




客户端

import java.io.*;
import java.net.*;
import java.util.*;
public class Send
public static void main(String[] args)
Scanner scan = new Scanner(System.in);
String toip = "127.0.0.1";
String temp = null;
try
System.out.println("请输入对方的IP地址(默认为本机):");
temp = scan.nextLine();
if(!temp.equals(""))
toip = temp;

Socket ssend = new Socket(InetAddress.getByName(toip),5600);
System.out.println("已连接到服务器!");
InputStream inStream = ssend.getInputStream();
OutputStream outStream = ssend.getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true);
System.out.println("现在请输入您想说的话(输入.quit结束会话):");
String line = " ";
while(true)
line = scan.nextLine();
out.println(line);

if(line.equalsIgnoreCase(".quit"))
System.out.println("连接已断开");
break;

String line1 = in.nextLine();
System.out.println("服务器:" + line1);


in.close();
out.close();
ssend.close();


catch(IOException ioe)
System.err.println("IOException: " + ioe);




是不是要用到多线程?小弟刚学JAVA不久,尚未涉及到多线程,希望各位多多指教

把服务器作为线程类,程序运行的时候就启动,用于接收消息,客户端是普通类,这样无论任何时候发送消息都可以接收的追问

额,第一句有点不懂,不过我希望实现的功能是服务器也可以连续的发送消息给客户端。

追答

不知道你到底是什么思路,把服务器作为线程类的意思是:无论什么时候发送信息都可以接到,如果服务器不是线程类,那么是无法时时更新发过来的信息的。当一个信息收到后,直接放到线程类里,该怎么处理是线程的问题(比如将信息显示出来,或者存储一个聊天记录)。
《额,第一句有点不懂,不过我希望实现的功能是服务器也可以连续的发送消息给客户端。》
把信息连续的发送更要用到线程了。

追问

我的思路是这样的。首先实现服务器正常接收客户端的信息,并显示,这个实现了。
接下来实现服务器能发送信息给客户端并在客户端上显示,这个也实现了。
可是当客户端输入多条信息的时候,服务器就卡在了输入的那条程序上,就是while循环里面的 scan.nextLine();上,一定要执行过这条语句(就是服务器输入信息)后println才会执行,客户端发送的信息才会被显示。我觉得这就是问题所在。
可能有点乱,这就是我现在的想法。

追答

必须用线程,你的服务器接收一条就发一条,这就是线程,发送完成了就等待下一次接收,把服务器改成线程类,程序运动的时候启动,就用来接收和发送信息,线程就像是迅雷的下载任务,总不能下载完成一个再下载另一个吧,你要是不了解线程那就得学习一下,线程也不是很难的。

追问

多谢你了!貌似有点懂了,我还有最后一个疑问,把服务器改成线程类后,是不是客户端可以发多条消息给服务器,但是服务器不能发送多条消息给客户端?

追答

不是,如果服务器改成线程类以后,那么就是当服务器接收到一条信息之后立即发送至客户端,发送完成之后又转回准备接收的状态。所以无论你发多少条,只要服务器是线程类,都可以把信息传给客户端。

参考技术A 多线程 不然不会追问

能否请教下如果需要多线程的话是怎么设置。我稍微看了下多线程的基本概念

追答

不是一两句话的事,你加805096337

追问

额,现在懂了,不麻烦你了,不过也谢谢你!

Java中的Scoket编程

网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。

java.net包中提供了两种常见的网络协议的支持:

  • TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称TCP / IP。
  • UDP:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。

在这里我们主要讲解socket编程(使用最为广泛的网络编程),举个简单的例子,就像是我们平常用的QQ,每个人用的都是一个Client(客户端),而服务端则是腾讯的服务器,我们彼此之间的通信是通过先将消息发送到服务端,然后服务端转发到目标客户端(你想要发送给的对象),而不是每个客户端直接通信。

由此我们可以得出socket通信的基本流程:

首先是客户端:通过IP地址和port(端口号)与服务端建立连接->进行信息传递—>关闭连接,然后是服务端:对客户端进行监听—>建立连接—>信息传递—>关闭连接。

下面是一个简单的实现客户端和服务端通信的例子:

  服务端:

 1 package com.internet.server;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.ServerSocket;
 7 import java.net.Socket;
 8 
 9 public class TestServer {
10     public static void main(String[] args) {
11         ServerSocket serverSocket = null;
12         Socket socket = null;
13         OutputStream out = null;
14         InputStream in = null;
15         int port = 12125;
16 
17         try {
18             serverSocket = new ServerSocket(port);
19             System.out.println("服务端开始监听!!!");
20             socket = serverSocket.accept();
21             in = socket.getInputStream();
22             byte[] b = new byte[1024];
23             out = socket.getOutputStream();
24             for (int i = 0; i < 3; i++) {
25                 int n = in.read(b);
26                 System.out.println("接收到的信息为:" + new String(b, 0, n));
27                 out.write(b, 0, n);
28             }
29 
30         } catch (IOException e) {
31             e.printStackTrace();
32         } finally {
33             try {
34                 out.close();
35                 in.close();
36                 socket.close();
37                 serverSocket.close();
38             } catch (IOException e) {
39                 e.printStackTrace();
40             }
41         }
42 
43     }
44 }

  客户端:

 1 package lib;
 2 
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.OutputStream;
 6 import java.net.Socket;
 7 
 8 public class TestClient {
 9     public static void main(String[] args) throws InterruptedException,
10             IOException {
11         Socket socket = null;
12         InputStream in = null;
13         OutputStream out = null;
14         // 定义端口
15         int port = 12125;
16         // 服务端的IP地址
17         String serverIP = "127.0.0.1";
18         // 传递的数据
19         String data[] = { "First", "Second", "Third" };
20         try {
21             socket = new Socket(serverIP, port);
22             out = socket.getOutputStream();
23             in = socket.getInputStream();
24             byte[] b = new byte[1024];
25             for (int i = 0; i < data.length; i++) {
26                 out.write(data[i].getBytes());
27                 int n = in.read(b);
28                 System.out.println("传递的数据为:" + new String(b, 0, n));
29             }
30         } catch (IOException e) {
31             e.printStackTrace();
32         } finally {
33             in.close();
34             out.close();
35             socket.close();
36         }
37     }
38 }

  服务端和客户端之间是通过我们之前提到的“流“(字节流)的方式进行信息传递的。在上述代码中我们需要保证客户端和服务端的端口号是一致的,同时客户端中的IP地址我们可以填写本机地址,即127.0.0.1也可以填写外网IP。只需要一个服务端即可,然后在多个客户端之间实现通信,当然这只是简单的信息传递,如果想要编写出类似于QQ的简单的小程序还需要swing,多线程等知识,感兴趣的小伙伴可以自行尝试。

以上是关于JAVA Scoket编了个小程序,想实现聊天室功能。可以一方连续发送消息,另一方同样可以联系发送消息的主要内容,如果未能解决你的问题,请参考以下文章

我用C#编了个小程序,想问下怎么在打开我的主窗口之前先全屏显示一个图片2秒钟啊???

java scoket (UDP通信模型)简易聊天室

自己编了个C#的串口调试程序,但发送命令后,得不到数据!找不到问题所在,想请教各位!谢谢,急用!

小程序版聊天室|聊天小程序|仿微信聊天界面小程序

我用c++编了个程序,能将一个3位数的个位与百位交换位置,可是为啥会闪退?

编了个程