基于TCP/IP在同一局域网下的数据传输

1.TCP/IP网络编程

    在开发网络应用程序的时候,会遇到Socket这个概念。一个应用程序通过一个Socket来建立远程连接,而Socket内部通过TCP/IP协议把数据传输到网络。

    TCP/IP是传输控制协议和网络协议的简称,它定义设备如何连入因特网,以及数据如何在他们之间传输的标准。TCP/IP不是一个协议,而是一个协议族的统称,里面包括了IP协议、ICMP协议、TCP协议、以及http、ftp、pop3协议等,网络计算机都采用这套协议族进行互联。

2.数据传输

  使用Socket进行网络编程时,本质上就是进行俩个进程之间的网络通信。其中一个进程必须充当服务器端,它会主动去监听某个指定位置的端口,列一个必须充当客户端,它必须主动与连接服务器端的IP地址和指定端口,如果连接成功,服务器端与客户端就成功的建立了一个TCP协议,双方后续就可以随时发送和接收数据。

  对服务器端来说,它的Socket是指定的IP地址和指定的端口号。

  对客户端来说,它的Socket是它所在的计算机的IP地址和一个操作系统分配的随机端口号。

3.服务器端

Java标准库提供了ServerSocket来实现对指定IP的指定端口的监听。实现程序如下:

public class Server {
    public static void main(String[] args) throws IOException {

        ServerSocket ss = new ServerSocket(6666); // 监听指定端口
        System.out.println("server is running...");
        //使用while循环来让服务器一直保持接收的状态
        while (true) {
            Socket sock = ss.accept();
            
            // 使用Socket流进行网络通信
            // ...
            
            System.out.println("connected from " + sock.getRemoteSocketAddress());
        }
    }
}

 需要注意的是:

(1)使用try-catch块来抛出异常

(2)使用while循环来让服务器一直保持接收状态。

(3)一定要指定服务器端的监听端口。

4.客户端

      客户端通过如下代码来连接到服务器端,而且一定要指定服务器的端口,否则会无法正确的进行数据传输。

public class Client {
    public static void main(String[] args) throws IOException {
        // 连接指定服务器和端口
        Socket sock = new Socket("localhost", 6666); 
        
       // 使用Socket流进行网络通信
       // ...
        
        // 关闭
        sock.close();
        System.out.println("disconnected.");
    }
}

5.参考示例:(服务器·与客户端在同一局域网下的聊天)

服务器端:

public static void main(String[] args) {

		Scanner input = new Scanner(System.in);
		try (DatagramSocket socket = new DatagramSocket(8888)) {
			DatagramPacket sendPacket = new DatagramPacket(new byte[1024], 1024,
					new InetSocketAddress("192.168.254.177", 9999));
			DatagramPacket receivePacket = new DatagramPacket(new byte[1024], 1024);

			while (true) {

				socket.receive(receivePacket);
				String receiveContent = new String(receivePacket.getData(), receivePacket.getOffset(),
						receivePacket.getLength());
				if (receiveContent.equals("over")) {
					System.out.println("对方退出聊天......");
					break;
				}
				System.out.println("它说" + receiveContent);

				System.out.print("你说:");
				String sendContent = input.nextLine();
				sendPacket.setData(sendContent.getBytes());
				socket.send(sendPacket);
				if (sendContent.equals("over")) {
					System.out.println("你退出聊天...");
					return;
				}

			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

客户端:

public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		
		while(true) {
			
			
			try (Socket cilent = new Socket("192.168.254.159", 8888);
                
				 BufferedWriter writer = new BufferedWriter(new 
                     OutputStreamWriter(cilent.getOutputStream()));
				 BufferedReader reader = new BufferedReader(new 
                     InputStreamReader(cilent.getInputStream()))
				) {
				//获取控制台的输入
				String question = input.nextLine();
				if(question.equals("over")) {
					break;
				}

				// 发送消息至服务器
				writer.write(question);
				writer.flush();
				
				//暂时结束本次输出
				cilent.shutdownOutput();
				
				//获取来自服务器的回答
				String answer = reader.readLine();
				System.out.println("【客户端】来自服务器的回答" + answer);
				

			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.println("本次聊天结束!!");
	}

  • 34
    点赞
  • 11
    收藏
  • 打赏
    打赏
  • 12
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论 12

打赏作者

#0000FF格子衫

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值