`
hz_chenwenbiao
  • 浏览: 1007777 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

socket通信编程

阅读更多

    昨天同学问了一个关于socket通信编程的程序,花了我一晚时间去修改,才将它改好。这个程序主要是做一个服务端接收处理多个客户端请求的例程,具体如下代码所示,挺好的学习例子:

server.java

/*
 * server.java
 *
 * Created on __DATE__, __TIME__
 */

package socket_;

import java.awt.event.KeyEvent;
import java.io.*;
import java.net.*;

//import socket_.SocketServer.Getinfo;

/**
 * 
 * @author __USER__
 */
public class server extends javax.swing.JFrame  implements Runnable{// 继承runnable之后,通过Runnable接口来实现多线程的功能

	private ServerSocket serverSocket;
	private Socket socket;
	private boolean hasStart;//是否开启服务器的标志
	
	/** Creates new form server */
	public server() {
		initComponents();
		hasStart = false;
		try {
			serverSocket = new ServerSocket(10000);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * This method is called from within the constructor to initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is always
	 * regenerated by the Form Editor.
	 */
	// GEN-BEGIN:initComponents
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents() {

		jScrollPane1 = new javax.swing.JScrollPane();
		jTextArea1 = new javax.swing.JTextArea();
		jLabel1 = new javax.swing.JLabel();
		jButton1 = new javax.swing.JButton();
		jTextField1 = new javax.swing.JTextField();
		jButton2 = new javax.swing.JButton();
		jButton3 = new javax.swing.JButton();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setTitle("\u670d\u52a1\u5668");

		jTextArea1.setColumns(20);
		jTextArea1.setRows(5);
		jScrollPane1.setViewportView(jTextArea1);

		jLabel1.setText("\u53d1\u9001");

		jButton1.setText("\u542f\u52a8");
		jButton1.setActionCommand("jButton1");
		jButton1.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton1ActionPerformed(evt);
			}
		});

		jButton2.setText("\u53d1\u9001");
		jButton2.setActionCommand("jButton2");
		jButton2.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton2ActionPerformed(evt);
			}
		});

		jButton3.setText("\u9000\u51fa");
		jButton3.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton3ActionPerformed(evt);
			}
		});

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
				getContentPane());
		getContentPane().setLayout(layout);
		layout
				.setHorizontalGroup(layout
						.createParallelGroup(
								javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								layout
										.createSequentialGroup()
										.addGap(18, 18, 18)
										.addGroup(
												layout
														.createParallelGroup(
																javax.swing.GroupLayout.Alignment.LEADING)
														.addGroup(
																layout
																		.createSequentialGroup()
																		.addComponent(
																				jButton1)
																		.addGap(
																				139,
																				139,
																				139)
																		.addComponent(
																				jButton2)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED,
																				161,
																				Short.MAX_VALUE)
																		.addComponent(
																				jButton3))
														.addGroup(
																layout
																		.createSequentialGroup()
																		.addComponent(
																				jLabel1)
																		.addGap(
																				26,
																				26,
																				26)
																		.addComponent(
																				jTextField1,
																				javax.swing.GroupLayout.DEFAULT_SIZE,
																				421,
																				Short.MAX_VALUE))
														.addComponent(
																jScrollPane1,
																javax.swing.GroupLayout.PREFERRED_SIZE,
																471,
																javax.swing.GroupLayout.PREFERRED_SIZE))
										.addContainerGap(19, Short.MAX_VALUE)));
		layout
				.setVerticalGroup(layout
						.createParallelGroup(
								javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								layout
										.createSequentialGroup()
										.addContainerGap()
										.addComponent(
												jScrollPane1,
												javax.swing.GroupLayout.PREFERRED_SIZE,
												239,
												javax.swing.GroupLayout.PREFERRED_SIZE)
										.addGap(29, 29, 29)
										.addGroup(
												layout
														.createParallelGroup(
																javax.swing.GroupLayout.Alignment.BASELINE)
														.addComponent(jLabel1)
														.addComponent(
																jTextField1,
																javax.swing.GroupLayout.PREFERRED_SIZE,
																javax.swing.GroupLayout.DEFAULT_SIZE,
																javax.swing.GroupLayout.PREFERRED_SIZE))
										.addGap(18, 18, 18)
										.addGroup(
												layout
														.createParallelGroup(
																javax.swing.GroupLayout.Alignment.BASELINE)
														.addComponent(jButton1)
														.addComponent(jButton3)
														.addComponent(jButton2))
										.addContainerGap(28, Short.MAX_VALUE)));

		pack();
	}// </editor-fold>

	// GEN-END:initComponents

	
	private class CreateSocket extends Thread{
		private Socket socket;
		private BufferedReader bufferedReader;
		private PrintWriter printWriter;
		
		
		public CreateSocket(Socket socket){
			this.socket = socket;
			try {
				bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}


		@Override
		public void run() {
//			printWriter.print(b)
			String temp;
			
			try {
				temp = bufferedReader.readLine();
				
				while(!"exit".equals(temp))
				{
					jTextArea1.append("服务器接收到客户" + socket.getLocalPort() + ":" + socket.getPort() + "的消息:"  + temp + "\n");
//					jTextArea1.setCaretPosition(jTextArea1.getText().length());//设置新加入的数据显示出来,滚动条向下滑
				
					//休眠一下再试读下一条
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					temp = bufferedReader.readLine();
				}
			} catch (IOException e) {
				e.printStackTrace();
				jTextArea1.append(e.toString() + "\n");
			}
			
			try {
				bufferedReader.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
				jTextArea1.append(e.getStackTrace() + "\n");
			}

		}
		
	}

	private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
		/*try {
			jTextArea1.append("服务器退出!\n");
			printWriter.println("exit");
			printWriter.flush();
		} catch (Exception e) {
			jTextArea1.append(e.toString() + "\n");

		} finally {
			System.exit(0);
		}*/
		
		System.exit(0);
	}

	private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
/*
		try {

			// printWriter需要分配空间
			printWriter.println(jTextField1.getText());
			printWriter.flush();
			jTextArea1.append("服务器端消息:" + jTextField1.getText() + "\n");// .append("服务器端消息:"
																		// +
																		// jTextField1.getText());
			jTextField1.setText("");

		} catch (Exception e) {
			System.out.println("run error");
			jTextArea1.append(e.toString() + "\n");

		}*/
	}

	
	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		
		if(hasStart) return;
		hasStart = true;
		
		jTextArea1.append("服务器已启动!" + "\n");
		jTextArea1.setCaretPosition(jTextArea1.getText().length());
		//再开启一个线程,因为主线程要用来作界面的显示。如果这里没用线程而直接开启serverSocket的监听,那就会在界面上看不到效果,因为主线程一直在做监听工作
		
		Thread thread = new Thread(this);
		thread.start();
		
		
//		for (int i = 0; i < 10; i++) {
//			Thread thread = new Thread(this); // 关键性,启动一个任务
//			thread.start();
//		}
	}
	
	@Override
	public void run() {
		while(true)
		{
			try {
				socket = serverSocket.accept();
			} catch (IOException e) {
				e.printStackTrace();
			}
			CreateSocket createSocket = new CreateSocket(socket);
			createSocket.start();
		}
	}
	

	/**
	 * @param args
	 *            the command line arguments
	 */
	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				new server().setVisible(true);
			}
		});
	}

	// Variables declaration - do not modify
	private javax.swing.JButton jButton1;
	private javax.swing.JButton jButton2;
	private javax.swing.JButton jButton3;
	private javax.swing.JLabel jLabel1;
	private javax.swing.JScrollPane jScrollPane1;
	private javax.swing.JTextArea jTextArea1;
	private javax.swing.JTextField jTextField1;
	// End of variables declaration//GEN-END:variables

	

}

 

 

Client.java

/*
 * Client.java
 *
 * Created on __DATE__, __TIME__
 */

package socket_;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

//import socket_.SocketClient.Getinfo;

/**
 *
 * @author  __USER__
 */
public class Client extends javax.swing.JFrame  {

	Socket socket;
	BufferedReader bufferedReader;
	PrintWriter printWriter;//=new PrintWriter("dasasadasdasd");

	/** Creates new form Client */
	public Client() {
		initComponents();
	}

	/** This method is called from within the constructor to
	 * initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is
	 * always regenerated by the Form Editor.
	 */
	//GEN-BEGIN:initComponents
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents() {

		jScrollPane1 = new javax.swing.JScrollPane();
		jTextArea1 = new javax.swing.JTextArea();
		jLabel1 = new javax.swing.JLabel();
		jTextField1 = new javax.swing.JTextField();
		jButton1 = new javax.swing.JButton();
		jButton2 = new javax.swing.JButton();
		jButton3 = new javax.swing.JButton();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setTitle("\u5ba2\u6237\u7aef");

		jTextArea1.setColumns(20);
		jTextArea1.setRows(5);
		jScrollPane1.setViewportView(jTextArea1);

		jLabel1.setText("jLabel1");

		jTextField1.setText("jTextField1");

		jButton1.setText("\u8fde\u63a5");
		jButton1.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton1ActionPerformed(evt);
			}
		});

		jButton2.setText("\u53d1\u9001");
		jButton2.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton2ActionPerformed(evt);
			}
		});

		jButton3.setText("\u9000\u51fa");
		jButton3.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				jButton3ActionPerformed(evt);
			}
		});

		javax.swing.GroupLayout layout = new javax.swing.GroupLayout(
				getContentPane());
		getContentPane().setLayout(layout);
		layout
				.setHorizontalGroup(layout
						.createParallelGroup(
								javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								layout
										.createSequentialGroup()
										.addGap(19, 19, 19)
										.addGroup(
												layout
														.createParallelGroup(
																javax.swing.GroupLayout.Alignment.LEADING)
														.addComponent(
																jScrollPane1,
																javax.swing.GroupLayout.DEFAULT_SIZE,
																482,
																Short.MAX_VALUE)
														.addGroup(
																javax.swing.GroupLayout.Alignment.TRAILING,
																layout
																		.createSequentialGroup()
																		.addComponent(
																				jLabel1)
																		.addGap(
																				18,
																				18,
																				18)
																		.addComponent(
																				jTextField1,
																				javax.swing.GroupLayout.DEFAULT_SIZE,
																				422,
																				Short.MAX_VALUE))
														.addGroup(
																layout
																		.createSequentialGroup()
																		.addComponent(
																				jButton1)
																		.addGap(
																				149,
																				149,
																				149)
																		.addComponent(
																				jButton2)
																		.addPreferredGap(
																				javax.swing.LayoutStyle.ComponentPlacement.RELATED,
																				162,
																				Short.MAX_VALUE)
																		.addComponent(
																				jButton3)))
										.addContainerGap()));
		layout
				.setVerticalGroup(layout
						.createParallelGroup(
								javax.swing.GroupLayout.Alignment.LEADING)
						.addGroup(
								layout
										.createSequentialGroup()
										.addGap(21, 21, 21)
										.addComponent(
												jScrollPane1,
												javax.swing.GroupLayout.PREFERRED_SIZE,
												234,
												javax.swing.GroupLayout.PREFERRED_SIZE)
										.addGap(18, 18, 18)
										.addGroup(
												layout
														.createParallelGroup(
																javax.swing.GroupLayout.Alignment.BASELINE)
														.addComponent(jLabel1)
														.addComponent(
																jTextField1,
																javax.swing.GroupLayout.PREFERRED_SIZE,
																javax.swing.GroupLayout.DEFAULT_SIZE,
																javax.swing.GroupLayout.PREFERRED_SIZE))
										.addGap(41, 41, 41)
										.addGroup(
												layout
														.createParallelGroup(
																javax.swing.GroupLayout.Alignment.BASELINE)
														.addComponent(jButton1)
														.addComponent(jButton3)
														.addComponent(jButton2))
										.addContainerGap(30, Short.MAX_VALUE)));

		pack();
	}

	

	private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
		try {
			jTextArea1.append("服务器退出!\n");
			printWriter.println("exit");
			printWriter.flush();
		} catch (Exception e) {
			jTextArea1.append(e.toString() + "\n");

			
		} finally {
			System.exit(0);
		}
	}

	private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
		try {
			printWriter.println(jTextField1.getText());
			printWriter.flush();
			jTextArea1.append("客户器端发送消息:" + jTextField1.getText() + "\n");// .append("服务器端消息:" + jTextField1.getText());
			jTextField1.setText("");
			jTextField1.grabFocus();//获取焦点
		} catch (Exception e) {
			System.out.println("send error");
			jTextArea1.append(e.toString() + "\n");
			
		}
	}

	private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
		try {
			socket = new Socket(InetAddress.getLocalHost(), 10000);
			jTextArea1.append("客户端已加入 \n");
			bufferedReader = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			printWriter = new PrintWriter(socket.getOutputStream());
			jButton2.setEnabled(true);
			
		} catch (Exception e) {
			
			jTextArea1.append(e.toString() + "\n");
		}
	}

	/**
	 * @param args the command line arguments
	 */
	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				new Client().setVisible(true);
			}
		});
	}

	//GEN-BEGIN:variables
	// Variables declaration - do not modify
	private javax.swing.JButton jButton1;
	private javax.swing.JButton jButton2;
	private javax.swing.JButton jButton3;
	private javax.swing.JLabel jLabel1;
	private javax.swing.JScrollPane jScrollPane1;
	private javax.swing.JTextArea jTextArea1;
	private javax.swing.JTextField jTextField1;
	// End of variables declaration//GEN-END:variables
}




 

要注意的就是用多线程的时候一定要有fork-join模型在脑子里:也就是我们要控制一个主线程(界面一般要做主线程,不然无法保持显示最新信息,而是处于像缰死的状态),然后分出子线程去完成所要的工作,最后再归到主线程。对于多个客户端的请求,服务端要对每个客户的请求都开一个新的socket和新的bufferedReader及新的printWriter用于与每个客户交互,不能共用。我们可以在多次运行client.java类,模拟多个客户端,我们从服务器端打印出来的信息可以看到客户端的端口号是不同的,因为对同一台机子的应用的区分就是靠端口来区分的。

分享到:
评论

相关推荐

    基于C#的socket通信编程

    本文将深入探讨基于C#的Socket通信编程,包括其基本原理、实现方式以及如何进行文件传输。 C#是一种广泛使用的面向对象的编程语言,它提供了丰富的类库来支持网络编程,其中就包括System.Net命名空间下的Socket类。...

    symbian socket通信编程代码TCP

    在Symbian Socket通信编程中,首先需要理解以下几个关键概念: 1. **Socket创建与绑定**:使用`RSocket`类创建Socket实例,然后调用`Open()`方法打开Socket,并通过`Bind()`方法将其绑定到特定的本地端口上,以便...

    symbian socket通信编程代码UCP

    本篇文章将深入探讨Symbian平台上的Socket通信编程,以标题中的"UCP"(可能是用户自定义的通信协议)为例,重点讨论如何进行UDP Socket编程。 **一、Symbian Socket基础** Symbian的Socket API基于POSIX标准,提供...

    delphi socket通信编程示例

    在本文中,我们将深入探讨如何使用Delphi进行Socket通信编程,包括客户端和服务端的实现。Socket通信是网络编程的基础,它允许不同计算机间的进程通过网络进行数据交换。 首先,让我们理解什么是Socket。Socket是...

    基于TCP协议的Socket通信编程实现C语言

    以上就是基于TCP协议的Socket通信编程的基本步骤。实际应用中,可能还需要处理错误、设置超时、非阻塞I/O等高级特性。在C语言中实现Socket通信,不仅需要对TCP/IP协议有深入理解,还需要掌握网络编程的基本概念和...

    基于QT的TCP socket通信编程 .doc

    QT基础知识与TCP Socket通信编程 QT简介 -------- QT是一个跨平台的C++图形用户界面应用程序框架,由诺基亚公司开发。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。QT是完全面向对象的,很容易...

    C# Socket通信编程学习资料

    C# Socket通信编程学习资料

    C#的Socket通信编程文档.pdf

    【C#的Socket通信编程】 Socket编程是网络通信的基础,特别是在C#中,它提供了对TCP/IP协议的支持。Socket在不同操作系统之间起着桥梁的作用,无论是UNIX、Windows还是Linux,都可以通过Socket进行跨平台的数据通信...

    Socket通信编程传输协议分析的python代码及wireshark抓取文件包

    Socket通信编程是网络编程的基础,它允许两个网络应用程序通过TCP或UDP进行数据交换。在本主题中,我们将深入探讨Python中的Socket通信,TCP协议的工作原理,以及如何使用Wireshark工具来捕获和分析网络包。 首先,...

    Socket通信编程

    Socket通信编程,更多关于学习的资料,请多多关注我的博客

    计算机网络实验二- Socket通信编程与传输协议分析

    计算机网络实验中的Socket通信编程与传输协议分析是一个深入理解TCP/IP协议栈中传输层工作原理的重要实践环节。在这个实验中,学生们将通过编程实践来掌握Socket接口的使用,理解TCP的连接建立、数据传输和连接关闭...

    SOCKET通信编程

    【SOCKET通信编程】是一种在计算机网络中实现进程间通信的技术,它允许两台或多台计算机通过网络交换数据。在本示例中,我们有一个客户端服务器端聊天程序,该程序利用了Socket通信来实现用户之间的实时对话。这个...

    socket 通信编程

    Socket通信编程是网络编程的基础,它允许两个或多个应用程序通过网络进行数据交换。在这个主题中,我们将深入探讨TCP和UDP两种主要的传输协议,以及如何使用Socket进行服务器和客户端的编程。 TCP(Transmission ...

    实验一 Socket 编程 一、实验目的 套接字实验

    Socket实验,客户端和用户端点对点通信,Socket编程实验报告 - 实验报告 实验一 Socket 编程 一、实验目的 通过 socket 程序的编写、调试,掌握 socket 编程的基本方法,了解客户端与 服务器端

    socket编程实例 TCP通信编程

    本实例主要关注的是基于TCP协议的Socket通信编程,这是一种面向连接、可靠的数据传输方式。 TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保了数据在发送端和...

    java socket通信编程

    Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,...

    socket通信MFC编程

    总的来说,"socket通信MFC编程"是一个涉及网络基础、MFC框架、多线程编程以及异常处理等多个IT领域的综合课题。通过学习和实践,开发者可以构建出强大的网络应用,满足并发的客户端和服务端通信需求。

    socket网络编程 TCP传输协议实现

    在实际应用中,我们通常会结合Socket接口进行编程,以实现TCP通信。 Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在...

Global site tag (gtag.js) - Google Analytics