Java网络编程——实现简单的网络聊天室(TCP和UDP两种方式)

Socket使用的TCP连接,需要先连接之后才能发送数据。

DatagramSocket使用的UDP连接,客户端不需要先连接数据,可以直接发送给指定服务端。

使用UDP协议

发送端:

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Scanner;

/**
 * 
 * @author Administrator
 * 发送端
 */
public class TestSend {

	public static void main(String[] args) {
		try {
			//1.创建自己的套接字(8000以后)—— DatagramSocket
			DatagramSocket client = new DatagramSocket();
			//2.发送内容
			Scanner sc = new Scanner(System.in);
			System.out.println("输入发送的内容:");
			String msg = sc.nextLine();
			//3.打包
			//创建一个IP对象
			InetAddress adds = InetAddress.getByName("192.168.1.105");
			DatagramPacket packet = new DatagramPacket(msg.getBytes(), msg.getBytes().length ,adds,12306);
			//4.发送包
			client.send(packet);
                   client.close();
		} catch (SocketException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (UnknownHostException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

}

 接收端

package socket;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * 
 * @author Administrator
 * 接收端
 */
public class TestRec {

	public static void main(String[] args) {
		
		try {
			//1.创建自己的套接字(8000以后)—— DatagramSocket
			DatagramSocket server = new DatagramSocket(9998);
			//2.准备接收容器
			byte []buf = new byte[1024];
			//3.封装成包裹 —— DatagramPacket
			DatagramPacket packet = new DatagramPacket(buf, buf.length);
			//3.读取的过程,分析数据
			server.receive(packet);
			System.out.println("对方IP:"+packet.getAddress());
			System.out.println("对方发送的数据:"+new String(packet.getData()));
		} catch (SocketException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		} 	
		
	}
}

使用TCP协议

发送端

package socketTCP;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * TCP协议,客户端(发送端)
 * @author Administrator
 *
 */
public class Client {

	public static void main(String[] args) throws IOException {
		//创建套接字,连接服务器端IP和端口
		Socket client = new Socket("192.168.1.107",10087);
		//创建输出流
		OutputStream output = client.getOutputStream();
		//创建要发送的内容
		String msg = "Hello World!";
		//发送数据,先将字符创装换成字节
		output.write(msg.getBytes());
  
           //接收对方回复
		//创建输入流
		InputStream input = client.getInputStream();
		byte buf[] = new byte[1024];
		int len = input.read(buf);
		System.out.println("接收到的回复:"+new String(buf,0,len));
	}

}

接收端

package socketTCP;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * TCP协议,服务器端(接收端)
 * @author Administrator
 *
 */
public class Server {

	public static void main(String[] args) {
		try {
			//创建套接字
			ServerSocket server = new ServerSocket(8888);
			//创建监听,等待客户端的连接,并得到客户端的套接字
			Socket client = server.accept();
			//获取输入流
			InputStream input = client.getInputStream();
			//创建存放数据的数组
			byte buf[] = new byte[1024];
			//从流中读取数据到数组中,并获取读取的长度
			int len = input.read(buf);
			//判断是否读取成功
			if (len != -1) { //读取成功
				
				System.out.println("对方IP:"+client.getInetAddress());
				System.out.println("对方发送的数据:"+ new String(buf, 0,len));
			}
			OutputStream output = client.getOutputStream();
			System.out.println("回复对方");
			String msg = "Hello World too!";
			output.write(msg.getBytes());
			
	    } catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

}
发布了22 篇原创文章 · 获赞 17 · 访问量 5856

猜你喜欢

转载自blog.csdn.net/weixin_42193813/article/details/104114215