java网络编程——socket

本文详细介绍了Java网络编程中的Socket应用,包括服务端如何使用ServerSocket监听端口,等待客户端连接,以及客户端如何通过Socket连接到服务器并发送请求。服务端涉及多个线程处理不同任务,而客户端主要负责发起连接和接收响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、服务端:

使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用, 所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。
1、主类:调用第一个线程类

public class TestMain {
JFrame jFrame;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new TestMain().initView();
	}
	public void initView()
	{
		jFrame=new JFrame("连接服务器");
		jFrame.setBounds(600, 100, 420, 600);
		jFrame.setLayout(null);
		JButton jButton=new JButton("连接服务器");
		jButton.setBounds(100, 100, 200, 50);
		jButton.addActionListener(new ActionListener() {
	
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				MyThread myThread=new MyThread();
				myThread.start();
			}
		});
		jFrame.add(jButton);
		jFrame.setVisible(true);
	}
}

2、第一个线程类MyThread:客户端连接和处理

public class MyThread extends Thread{
	//1、创建成员变量
	ServerSocket Ssocket;//服务器端
	int port=9995;//端口号尽量大,程序网络通讯
	//2、加构造方法,服务器启动
	public MyThread() {
		try {
			Ssocket=new ServerSocket(port);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//3、在服务器端创建客户端对象
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			try {
				//1、检查客户端连接
				//.accept方法用于产生阻塞,直到接收到一个连接,并且返回一个客户端的socket对象实例
				Socket socket=Ssocket.accept();
				//2、处理客户端Socket信息
				MyThread_xinxi myThread_xinxi=new MyThread_xinxi(socket);
				myThread_xinxi.start();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
}

3、第二个线程类:处理信息

/*
 * 功能:处理信息。getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
 */
public class MyThread_xinxi extends Thread{
	Socket socket;//建立网络连接时使用,在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话
	BufferedReader in;//接收消息
	/*
	 * 方法名:MyThread_xinxi
	 * 功能:给成员变量socket赋值
	 */
	public MyThread_xinxi(Socket socket){
		this.socket=socket;
		try {
			//.getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例
			in=new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {//收数据
			try {
				String msg=in.readLine();//从客户端读数据  有数据,无数据null
				if (msg!=null) {
					//收:客户端发消息了,处理消息
					System.out.println("消息:"+msg);
					//发送
					//.getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例
					PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")), true);
					//回
					out.println("服务端给客户端发送成功");
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

二、客户端:

通过 socket 连接到服务器并发送一个请求,然后等待一个响应。
1、主类:发请求,连接服务器,给服务器发消息

public class TestMain {
	JFrame jFrame;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new TestMain().initView();
	}
	public void initView()
	{
		jFrame = new JFrame("Customer");
		jFrame.setBounds(600, 100, 420, 600);
		jFrame.setLayout(null);
		JButton jButton=new JButton("启动");
		jButton.setBounds(100, 100, 200, 50);
		jFrame.add(jButton);
		jButton.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				try {
					//发出请求,连接服务器
					Socket socket=new Socket("127.0.0.1", 9995);//IP地址,端口号
					//1、给服务器发消息
					PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")), true);
					out.println("服务器接收");
					//2、接收消息
					new MyThread_xinxi(socket).start();
				} catch (UnknownHostException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		jFrame.setVisible(true);
	}
}

2、线程类:接收消息

/*
 * 功能:处理信息
 */
public class MyThread_xinxi extends Thread{
	Socket socket;//建立网络连接时使用,在连接成功时,应用程序两端都会产生一个socket实例,操作这个实例,完成所需的会话
	BufferedReader in;//接收消息
	/*
	 * 方法名:MyThread_xinxi
	 * 功能:给成员变量赋值
	 */
	public MyThread_xinxi(Socket socket){
		this.socket=socket;
		try {
			in=new BufferedReader(new InputStreamReader(socket.getInputStream(), "gb2312"));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {//收数据
			try {
				String msg=in.readLine();//从客户端读数据  有数据,无数据null
				if (msg!=null) {
					//收:客户端发消息了,处理消息
					System.out.println("消息:"+msg);
					//发送
					//PrintWriter out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "gb2312")), true);
					//回
					//out.println("111");
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值