网络编程第二部(服务器与客户端双向通信)

之前实现了服务器与客户端的单项通信,现在来实现双向通信,这里其实就是加了一个线程,因为调用read()方法的时候会产生阻塞;所以要调用线程。下面上代码,在代码里有注释。在代码里说明会好一点。

  • 客户端代码
//这个模块里主要是要显示出客户端界面
public class DrawClient {
	public void showUI() {
		JFrame jf = new JFrame();
		jf.setSize(400, 300);
		jf.setTitle("客户端 Meetting by gzh4869--0.1");
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(3);
		
		//流式布局
		FlowLayout fl = new FlowLayout();
		jf.setLayout(fl);

		JButton jub = new JButton("发送");
		jf.add(jub);

		JTextField jtf = new JTextField(20);
		jf.add(jtf);

		JTextArea jea = new JTextArea(10, 30);
		jf.add(jea);

		jf.setVisible(true);

		ConnClient cc = new ConnClient(jea);
		//cc.Conn()就是判断是否连接成功
		if (cc.Conn()) {
			cc.start();//在这里启动线程,假设不用线程,那就会用到read()方法,那么程序就会阻塞,无法向下执行,所以这里要用线程
			System.out.println("成功接入线程");
			jub.addActionListener(new ActionListener() {
				String s;
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method st

					try {
					//将文本框内容发送之后在清零
						s = jtf.getText();
						cc.ops.write(s.getBytes());
						jtf.setText("");//清零
						System.out.println("客户端发送成功");
					} catch (Exception ef) {
						ef.printStackTrace();
					}

				}

			});
		}
	}

	public static void main(String[] args) {
		DrawClient dc = new DrawClient();
		dc.showUI();
	}
}
//这个模块主要是用来判断客户端代码是否连接成功
public class ConnClient extends Thread {
	
	 InputStream ips;
	 OutputStream ops;
	 JTextArea jea;
	
	public ConnClient(JTextArea jea) {
		this.jea = jea;
	}

	public void run() {	
		System.out.println("线程开始执行");
		int len = 0;
		byte[] buf = new byte[1024];
		System.out.println("1");
		try {
			while ((len = ips.read(buf)) != -1) {
				String s2 = new String(buf);
				System.out.println(s2);
				jea.append(s2+"\r\n");//这里最好用append(),如果用setText();新的内容会将老的内容覆盖掉
			}
			System.out.println("客户端接收成功");
			ips.close();
		} catch (Exception ef) {
			ef.printStackTrace();
		}
	}
	//判断是否连接成功
	public boolean Conn() {
		try {
			Socket st = new Socket("127.0.0.1", 4578);
			System.out.println("连接成功");

			// 输入输出流
			ips = st.getInputStream();
			ops = st.getOutputStream();

			return true;
		} catch (Exception ef) {
			ef.printStackTrace();
		}
		return false;
	}
}
  • 服务器端代码

  • 因为这里消息是互通的,所以服务器端代码和客户端代码差不多,因为是双向的消息传递也要用到线程

public class ConnServer extends Thread {

	InputStream ips;
	OutputStream ops;
	JTextArea jea;
	JTextField jtf;

	public ConnServer(JTextArea jea,JTextField jtf) {
		this.jea = jea;
		this.jtf = jtf;
	}

	public void run() {
		int len;
		byte[] buf = new byte[1024];

		try {
			while ((len = ips.read(buf)) != -1) {
				String s2 = new String(buf);
				System.out.println(s2);
				jea.append(s2+"\r\n");;
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("服务器接收成功");

	}
	//服务器与客户端是否连接
	public boolean Conn() {
		try {
			ServerSocket sst = new ServerSocket(4578);
			Socket st = sst.accept();
			System.out.println("连接成功");

			// 输入输出流
			ips = st.getInputStream();
			ops = st.getOutputStream();
				
			return true;
		} catch (Exception ef) {
			ef.printStackTrace();
		}
		return false;
	}

}

public class DrawServer {
	public void showUI() {
		JFrame jf = new JFrame();
		jf.setSize(400, 300);
		jf.setTitle("服务器 Meetting by gzh4869--0.1");
		jf.setLocationRelativeTo(null);
		jf.setDefaultCloseOperation(3);

		FlowLayout fl = new FlowLayout();
		jf.setLayout(fl);
		
		JTextField jtf =  new JTextField(20);
		jf.add(jtf);
		
		JButton jub = new JButton("发送");
		jf.add(jub);
		
		JTextArea jea = new JTextArea(10, 30);
		jf.add(jea);

		jf.setVisible(true);

		ConnServer cs = new ConnServer(jea,jtf);

		if (cs.Conn()) {		
			cs.start();
			jub.addActionListener(new ActionListener() {			
				String s;			
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					s = jtf.getText();
					try {
						cs.ops.write(s.getBytes());
						System.out.println("服务器发送成功");
						jtf.setText("");
						//cs.ops.close();
					}catch(Exception ef) {
						ef.printStackTrace();
					}
				}				
			});
		}
	}
	public static void main(String[] arg) {
		DrawServer ds = new DrawServer();
		ds.showUI();
	}
}
  • 效果
  • 在这里插入图片描述
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
### 回答1: Socket编程是一种网络编程技术,它可以实现客户端服务器之间的通信。在Socket编程中,客户端服务器通过套接字(Socket)建立连接,然后通过Socket发送和接收数据。 客户端服务器之间的通信可以分为两种方式:TCP和UDP。TCP是一种可靠的连接协议,它可以保证数据的可靠传输,但是速度较慢。UDP是一种不可靠的连接协议,它可以快速传输数据,但是数据的可靠性不如TCP。 在Socket编程中,客户端服务器需要分别创建一个Socket对象,然后通过Socket对象建立连接。客户端通过Socket对象向服务器发送数据,服务器通过Socket对象接收数据,并且可以向客户端发送数据。 Socket编程需要掌握网络编程的基础知识,包括IP地址、端口号、协议等。同时,还需要了解Socket编程的相关API,如socket()、bind()、listen()、accept()、connect()、send()、recv()等函数。 Socket编程可以应用于各种网络应用程序,如Web服务器、邮件服务器、聊天程序等。它是网络编程中的重要技术之一,对于网络程序员来说,掌握Socket编程是必不可少的。 ### 回答2: Socket编程是一种在计算机网络中实现进程间通信的常用方式,可以用来实现客户端服务器之间的通信。实现Socket通信的核心在于建立连接,通过连接实现数据的发送和接收。下面,我们将从以下几个方面来说明Socket编程实现客户端服务器通信的过程: 一、建立连接 客户端服务器之间的连接可以采用TCP或UDP协议来建立。当采用TCP协议时,需要先建立三次握手,确保连接的可靠性,这会消耗一定的时间。而采用UDP协议则不需要建立连接,可以直接发送数据包,但是由于UDP协议不具备可靠性,可能会导致数据丢失或失序。 二、数据发送 在建立连接之后,客户端服务器之间可以进行数据的发送和接收。客户端在发送数据时,需要先创建一个套接字,调用send()函数发送数据。服务器端在接收数据时,则需要先创建一个套接字,调用recv()函数接收数据。在数据发送时,可以选择发送数据的大小,也可以选择分包发送。 三、数据接收 当客户端发送数据之后,服务器端会接收到数据。服务器端需要先创建一个套接字,然后监听并接收客户端发送的数据。在接收数据时,服务器端也可以选择一次性接收全部数据,也可以选择分批次接收数据。 通过以上步骤,就可以实现客户端服务器之间的通信。在实际应用中,还需要考虑多线程和多进程的应用,以提高系统的并发性能。同时,还需要加入安全措施,防止黑客攻击。总之,Socket编程是网络编程的基础,掌握Socket编程的方法和技巧,可以更好地实现客户端服务器之间的通信。 ### 回答3: Socket编程是一种基于网络通信的编程技术,其主要目的是实现客户端服务器之间的通信。在Socket编程中,客户端服务器之间通过Socket通信协议建立连接,进行数据传输和通信。 Socket编程实现客户端服务器通信的过程,通常包括以下几个步骤: 1. 创建Socket对象:客户端服务器都需要创建Socket对象来进行通信。客户端使用Socket对象来连接服务器服务器使用Socket对象来监听客户端请求并返回数据。 2. 连接服务器客户端通过Socket对象连接服务器,可以指定服务器的IP地址和端口号。服务器通过监听客户端请求,接收客户端请求信息。 3. 发送消息:客户端创建输出流,向服务器发送消息。服务器通过读取客户端发送的消息,处理请求,并返回响应数据。 4. 接收消息:服务器创建输入流,读取客户端发送的数据并处理请求。服务器通过输出流向客户端返回响应数据。 5. 关闭Socket连接:当通信结束时,客户端服务器均需关闭Socket连接。 Socket编程的实现方式多种多样,可以使用不同的编程语言和工具进行开发。例如,Java语言可以使用Java Socket API实现Socket编程,C++可以使用Winsock或Socket类库实现Socket编程,Python可以使用socket模块实现Socket编程等。 在实际应用中,Socket编程广泛应用于各种网络应用场景,如Web服务器、FTP服务器、邮件服务器等。通过Socket编程,可以实现高效、可靠的网络通信,为各种应用提供了强有力的支持。

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值