【Java】java高级之网络编程

一、Socket服务端

1. 基本Socket服务端编程

基本流程:

  1. 创建服务端套接字,填入端口号
  2. 检测客户端的接入
  3. 获取输入流,用来读取数据
  4. 读取输入流中的数据
  5. 输出从客户端获取的数据

对应流程用代码实现:

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


public class Test {
	public static void main(String[] args) {
		
		byte[] data = new byte[128];
		int len = 0;
		
		try {
			//1.创建服务端套接字,填入端口号
			ServerSocket socket = new ServerSocket(8801);
			System.out.println("socket套接字创建成功,等待连接~~~");
			
			//2.检测客户端的接入
			Socket con = socket.accept();
			System.out.println("有客户端接入");
			
			//3.获取输入流,用来读取数据
			InputStream in = con.getInputStream();
			
			//4.读取输入流中的数据
			len = in.read(data);
			
			//5.输出从客户端获取的数据
			//String()方法将byte转化为字符串
			System.out.println("读到消息:"+ new String(data, 0, len));		
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果:

在这里插入图片描述

2. Socket服务端支持多连接

想要多连接必须创建新的线程来对接多个客户端,所以这里我们用到Java多线程,通过循环去不断监听客户端接入,然后创建新的线程去对接每个客户端。

实现代码:

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


public class Test {
	public static void main(String[] args) {
		
		
		
		try {
			//1.创建服务端套接字,填入端口号
			ServerSocket socket = new ServerSocket(8801);
			System.out.println("socket套接字创建成功,等待连接~~~");
			
			while(true){
				//2.检测客户端的接入
				final Socket con = socket.accept();
				System.out.println("有客户端接入");
				
				new Thread(new Runnable() {
					
					public void run() {
						// TODO Auto-generated method stub
						//3.获取输入流,用来读取数据
						InputStream in;
						try {
							in = con.getInputStream();
							
							int len = 0;
							byte[] data = new byte[128];
							
							//4.读取输入流中的数据
							len = in.read(data);
							
							//5.输出从客户端获取的数据
							//String()方法将byte转化为字符串
							System.out.println("读到消息:"+ new String(data, 0, len));	
							
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}).start();
				
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行结果:

在这里插入图片描述

这里要注意,当客户端连接上以后,新的线程即被创建,当一条消息发送完毕的时候,该线程会自动结束,想要再次发送消息,必须再次建立连接,这就意味着,在以后安卓APP开发中,按一次屏幕上的按钮,一个客户端就会被接入,一个新的线程就会被创建,然后再进行通信。



二、Socket客户端

1. 基本Socket服务端编程

实现基本流程:

  1. 创建客户端套接字,填充ip地址和端口号
  2. 获取输出流,用来发送数据
  3. 键盘获取输入发送内容
  4. 发送数据

对应代码实现:

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


public class Test {
	public static void main(String[] args) {
		
		try {
			//1.创建客户端套接字,填充ip地址和端口号
			Socket client = new Socket("192.168.0.15",8801);
			
			//2.获取输出流,用来发送数据
			OutputStream out = client.getOutputStream();
			
			//3.键盘获取输入发送内容
			Scanner sc = new Scanner(System.in);
			String message = sc.next();
			
			//4.发送数据
			//用getBytes()方法将字符串转化为字节数组
			out.write(message.getBytes());
			
		} 
		 catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}

运行结果:

客户端:

在这里插入图片描述

服务端:

在这里插入图片描述

2. Socket客户端支持发送和接收

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;


public class Test {
	public static void main(String[] args) {
		
		try {
			//1.创建客户端套接字,填充ip地址和端口号
			Socket client = new Socket("192.168.0.15",8880);
			
			//2.获取输出流,用来发送数据
			OutputStream out = client.getOutputStream();
			
			//3.键盘获取输入发送内容
			Scanner sc = new Scanner(System.in);
			String message = sc.next();
			
			//4.发送数据
			//用getBytes()方法将字符串转化为字节数组
			out.write(message.getBytes());
			
			//5.获得数据接收通道
			InputStream in = client.getInputStream();
			int len;
			byte[] data = new byte[128];
			
			//6.读取数据
			len = in.read(data);
			System.out.println("获得服务端返回数据是:"+new String(data, 0, len));

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

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT阳晨。

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值