300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Java网络编程并实现一对一聊天室功能

Java网络编程并实现一对一聊天室功能

时间:2019-11-11 07:17:00

相关推荐

Java网络编程并实现一对一聊天室功能

Java网络编程

目录

Java网络编程1、计算机网络2、网路通信的要素TCP/IP模型:3、IPIP地址的分类4、端口5、通信协议TCP 和 UDP 对比6、TCP1、基础通信2、文件上传7、UDP1、基础通信2、多线程一对一聊天室

1、计算机网络

计算机网络:计算机网络是指将地理位置不同具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作,网络管理软件及网络通信协议的管理和协调下,实现资源共享信息传递的计算机系统。

2、网路通信的要素

通信双方地址: IP:端口号

规则:网络通信的协议

TCP/IP模型:

网络编程中的两个主要的问题

如何准确的定位到网络上的一台主机?ip:端口号 定位到这个计算机上的某个资源

找到了主机,如何传输数据呢?

网络编程中的要素

IP 和 端口号网络通信协议:UDP 和 TCP

万物皆对象 – Java

3、IP

IP地址:InetAddress.java

唯一定位一台网络上的计算机127.0.0.1 :代表本机地址,也叫localhost

IP地址的分类

IPV4 / IPV6

IPV4: 例:127.0.0.1 ,由四个字节组成,每个字节大小为0~255;全球共42亿个IPV4地址,30亿在北美,4亿在亚洲,就用尽了

IPV6:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX

它是128位的,用":"分成8段,每个X是一个16进制数(16 = 2^4);

公网(互联网) / 私网(局域网)

局域网:192.168.1.1ABCD类地址(需要了解)

4、端口

表示计算机上的一个程序的进程:

不同的进程有不同的端口号被规定范围是 0~65535 ,TCP / UDP 不同,各65535个端口号

端口分类:

公有端口 0~1023

HTTP:80HTTPS:443FTP:21Telent:23

程序可注册端口:1024~49151,分配给用户或程序

Tomcat:8080MySQL:3306Oracle:1521

动态、私有:49151~65535

Java中获取相关地址信息

//查询本地地址InetAddress local0 = InetAddress.getByName("127.0.0.1");InetAddress local1 = InetAddress.getByName("localhost");InetAddress local2 = InetAddress.getLocalHost();//查询网络地址InetAddress address = InetAddress.getByName("");//常用方法System.out.println(address.getHostAddress());//获得ipSystem.out.println(address.getHostName()); //获得域名

Windows端口相关常用命令:

netstat -ano #查看所有端口号netstat -ano|findstr "8080" #查看8080端口号tasklist|findstr "8080" #查看指定端口的进程taskkill /f /t /im "进程id或者进程名称" #杀掉进程

5、通信协议

TCP:用户传输协议UDP:用户数据报协议
TCP 和 UDP 对比

TCP,类似于打电话

需要连接,稳定

三次握手,四次挥手

客户端、服务端

传输完成,释放连接,效率低

UDP,类似于发短信

不连接,不稳定客户端、服务端:没有明确的界限不管对方需不需要接收,都发送DDOS:洪水攻击

6、TCP

1、基础通信
客户端 连接服务器 socket发送消息 服务端 建立服务的端口等待用户的连接 accept接收消息

客户端核心代码

//1.要知道服务器的地址InetAddress inetAddress = InetAddress.getByName("127.0.0.1");int port = 9999;//2.创建一个socket连接Socket socket = new Socket(inetAddress, port);//3.发送消息 IO流OutputStream os = socket.getOutputStream();os.write("您好,我是客户端".getBytes(StandardCharsets.UTF_8));//4.关闭资源os.close();socket。close();

服务端核心代码

//1.要想让客户端连接,得有一个地址ServerSocket serverSocket = new ServerSocket(9999);while (true){//循环接受客户端发送的消息//2.等待客户端连接过来Socket socket = serverSocket.accept();//3.读取客户端发送的数据InputStream inputStream = socket.getInputStream();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len;while ((len = inputStream.read(buffer)) != -1){baos.write(buffer,0,len);}System.out.println(baos.toString());}//4.关闭资源baos.close();inputStream.close();socket.close();serverSocket.close();

2、文件上传

7、UDP

1、基础通信

发送方代码

//1.建立一个socketDatagramSocket socket = new DatagramSocket();//2.建个包,包里面是要发送的数据String msg = "您好,我是udp客户端";InetAddress serverAddress = InetAddress.getByName("localhost");int port = 9000;DatagramPacket packet = new DatagramPacket(msg.getBytes(StandardCharsets.UTF_8), 0, msg.getBytes(StandardCharsets.UTF_8).length, serverAddress, port);//3.发送数据socket.send(packet);//4.关闭资源socket.close();

接受方代码

//1.开放端口DatagramSocket socket = new DatagramSocket(9000);//2.接受数据包byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);socket.receive(packet);//阻塞接受System.out.println(packet.getAddress().getHostAddress());//发送方地址System.out.println(new String(packet.getData(),0,packet.getLength()));//数据//3.关闭资源socket.close();

2、多线程一对一聊天室

发送方代码

/*** 基于UDP的聊天室 -- 发送方*/public class Sender implements Runnable {DatagramSocket socket = null;BufferedReader reader = null;private int sendPort;private int receivePort;private String receiveAddress;public Sender(int sendPort, String receiveAddress, int receivePort) {this.sendPort = sendPort;this.receivePort = receivePort;this.receiveAddress = receiveAddress;try {this.socket = new DatagramSocket(sendPort);this.reader = new BufferedReader(new InputStreamReader(System.in));} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//2.准备要发送的数据,从控制台获取String line = reader.readLine();byte[] sendData = line.getBytes(StandardCharsets.UTF_8);//要发送的数据byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(sendData,0, sendData.length,new InetSocketAddress(this.receiveAddress, this.receivePort));//3.发送数据socket.send(packet);if (line.equals("bye")){break;}}}catch (Exception e){e.printStackTrace();}//4.关闭资源socket.close();}}

接受方代码

/*** 基于UDP的聊天室 -- 接受方*/public class Receiver implements Runnable {private int receivePort;DatagramSocket socket = null;public Receiver(int receivePort) {this.receivePort = receivePort;try {this.socket = new DatagramSocket(this.receivePort);} catch (SocketException e) {e.printStackTrace();}}@Overridepublic void run() {try {while (true){//循环接受数据//2.获取对方发送的数据byte[] buffer = new byte[1024];DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);socket.receive(packet);//打印数据内容String receivedData = new String(packet.getData(),0,packet.getLength()); System.out.println(packet.getAddress().getHostAddress()+":"+packet.getPort()+":"+receivedData);//当对方输入bye时,断开连接if (receivedData.equals("bye")){break;}}}catch (Exception e){e.printStackTrace();}//4.关闭资源socket.close();}}

测试

//用户1public class Test01 {public static void main(String[] args) {new Thread(new Receiver(9102)).start();new Thread(new Sender(9002,"localhost",9101)).start();}}//用户2public class Test02 {public static void main(String[] args) {new Thread(new Receiver(9101)).start();new Thread(new Sender(9001,"localhost",9102)).start();}}

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