java网络聊天工具_使用java实现一个hello/hi的简单的网络聊天程序

1、socket原理

Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。

套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。

1、服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。

2、客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3、连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

7e6512b03e61e9e73c73f645ddfda4ef.png

2、基于java中的socket编程

客户端:

importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;public classclient {public static void main(String args[]) throwsException {//连接本地主机,端口自设,与服务端一致即可

String host = "127.0.0.1";int port = 23333;//通过socket与服务端建立连接

Socket socket = newSocket(host, port);if(socket.isConnected()){

System.out.println("Connected!");

}//将要发送的信息写入输出流

OutputStream output =socket.getOutputStream();

String sent= "hello";

socket.getOutputStream().write(sent.getBytes("UTF-8"));//关闭客户端的输出流(单向,并未关闭socket)

socket.shutdownOutput();

System.out.println("sent message to server: " +sent);//读取从server返回的输入流

InputStream input =socket.getInputStream();byte[] bytes = new byte[1024];intlen;

StringBuilder get= newStringBuilder();while ((len = input.read(bytes)) != -1) {

get.append(new String(bytes, 0, len,"UTF-8"));

}

System.out.println("get message from server: " +get);//关闭socket

input.close();

output.close();

socket.close();

}

}

服务器端:

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

public class server {

public static void main(String[] args) throws Exception {

// 监听指定的端口,阻塞直至客户端连接此端口

int port = 23333;

ServerSocket server = new ServerSocket(port);

System.out.println("server is waiting...");

Socket socket = server.accept();

System.out.println("Connected!");

// 读取从客户端返回的输入流,至尾端时返回-1

InputStream input = socket.getInputStream();

byte[] bytes = new byte[1024];

int len;

StringBuilder get = new StringBuilder();

while ((len = input.read(bytes)) != -1) {

get.append(new String(bytes, 0, len, "UTF-8"));

}

System.out.println("get message from client: " + get);

OutputStream output = socket.getOutputStream();

String sent = "Hi there";

output.write(sent.getBytes("UTF-8"));

System.out.println("sent message to client: " + sent);

// 关闭socket与服务器端

input.close();

output.close();

socket.close();

server.close();

}

}

实验结果:

首先运行服务器

88644b6975f63ffcacaf38f00a486843.png

然后运行客户端

beff658110161cd21d94470602d125d5.png

然后服务器端结果

4317ceb8473ac4c47c30128c88a62790.png

3、程序思路

(1)建立一个服务器ServerSocket,并同时定义好ServerSocket的监听端口;

(2)ServerSocket 调用accept()方法,使之处于阻塞。

(3)创建一个客户机Socket,并设置好服务器的IP和端口。

(4)客户机发出连接请求,建立连接。

(5)分别取得服务器和客户端ServerSocket 和Socket的InputStream和OutputStream.

(6)  利用Socket和ServerSocket进行数据通信。

4、linux中的socket与windows中socket文件之间的区别。

socket作为套接字,能够对数据进行包装后进行发送,socket本质是一个文件。

Linux中是将socket文件视为普通文件,而在windows中将socket文件看成是一个网络连接来对待,因此需要调用专门针对 socket 而设计的数据传输函数。

在window操作系统中,使用native标注的本地方法在编译时会生成一个动态链接库(.dll文件)为JAVA语言提供相应的本地服务。

LINUX提供的相应Socket API

int socket(itn domain, int type, int protocol); // 创建一个套接字

int bind(int sockfd, const struct sockaddr *addr, socklen_t addelen);// 将套接字绑定到地址上

int listen(int sockfd, int backlog); // 监听连接

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);// 接收一个连接请求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您讲解基于Java语言编写一个网络聊天程序的步骤。 首先,我们需要选择网络通信协议和Socket通信模型。在这里,我们选择使用TCP协议和C/S(客户端/服务器端)模型。 然后,我们需要编写客户端和服务器端的代码。 客户端代码: ```java import java.io.*; import java.net.*; public class ChatClient { public static void main(String[] args) { try { // 连接服务器 Socket socket = new Socket("127.0.0.1", 8888); // 发送消息 OutputStream os = socket.getOutputStream(); os.write("Hello, Server!\n".getBytes()); // 接收消息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String message = br.readLine(); System.out.println("Server: " + message); // 关闭连接 os.close(); is.close(); br.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 服务器端代码: ```java import java.io.*; import java.net.*; public class ChatServer { public static void main(String[] args) { try { // 监听端口 ServerSocket serverSocket = new ServerSocket(8888); System.out.println("Server started."); while (true) { // 接收客户端连接 Socket socket = serverSocket.accept(); System.out.println("Client " + socket.getInetAddress().getHostName() + " connected."); // 接收消息 InputStream is = socket.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String message = br.readLine(); System.out.println("Client: " + message); // 发送消息 OutputStream os = socket.getOutputStream(); os.write("Hello, Client!\n".getBytes()); // 关闭连接 os.close(); is.close(); br.close(); socket.close(); System.out.println("Client disconnected."); } } catch (IOException e) { e.printStackTrace(); } } } ``` 在客户端连接成功后,客户端发送消息,服务器端接收消息并回复消息,然后关闭连接。 这只是一个简单的示例,实际的聊天程序需要处理多个客户端的连接和消息传输,并且需要使用多线程等技术来实现。如果您需要实现一个完整的聊天程序,建议参考更完整的代码示例和教程。 希望以上内容能够对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值