基于Socket的java网络编程(实现类似于QQ两人聊天的交互)

基于Socket的java网络编程

1,什么是Socket

网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket。Socket通常用来实现客户方和服务方的连接。Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定。但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。

2,Socket通讯的过程

Server端Listen(监听)某个端口是否有连接请求,Client端向Server 端发出Connect(连接)请求,Server端向Client端发回Accept(接受)消息。一个连接就建立起来了。Server端和Client 端都可以通过Send,Write等方法与对方通信。

对于一个功能齐全的Socket,都要包含以下基本结构,其工作过程包含以下四个基本的步骤:

  (1) 创建Socket;
  (2) 打开连接到Socket的输入/出流;
  (3) 按照一定的协议对Socket进行读/写操作;
  (4) 关闭Socket.(在实际应用中,并未使用到显示的close,虽然很多文章都推荐如此,不过在我的程序中,可能因为程序本身比较简单,要求不高,所以并未造成什么影响。)
 

3,今天写了一个运用socket实现类似于QQ两个人交互信息的例子,写的不是很完善,有不好的地方希望能指出来。

/**
*socket 服务端代码
*/
	package cjy.com;

	import java.io.BufferedReader;
	import java.io.IOException;
	import java.io.InputStream;
	import java.io.InputStreamReader;
	import java.io.OutputStream;
	import java.net.ServerSocket;
	import java.net.Socket;

	public class SocketServer {

		ServerSocket serverSocket = null;
		
		Socket socket = null;

		public void sockets() {
			try {
				serverSocket = new ServerSocket(8888);
				System.out.println("服务器开启。。。");
				int i = 0;
				// 实现多个客户端连接
				while (true) {
					socket = serverSocket.accept();
					System.out.println("客户端" + i + "连接成功。。。");
					if(socket!=null){
						Thread thread = new Thread(new LogicThread(socket));
						thread.setDaemon(true);
						thread.start();
						i++;
					}
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		private class LogicThread implements Runnable {
			Socket socket = null;
			InputStream in = null;

			public LogicThread(Socket socket) {
				this.socket = socket;
			}

			public void run() {
				// TODO Auto-generated method stub
				System.out.println(socket.getInetAddress());
				try {
					
					in = socket.getInputStream();
					byte[] b = new byte[1024];
					// 实现一次连接多次通话
					while (true) {
						// 把接受数据写入线程
						new Thread() {
							public void run() {
								while (true) {
										byte[] b = new byte[1024];
										int n;
										try {
											n = in.read(b);// 属于阻塞方法
											System.out.println("接受数据:"
													+ new String(b, 0, n));
										} catch (IOException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
											try {
												socket.close();
												break;
											} catch (IOException e1) {
												// TODO Auto-generated catch block
												e1.printStackTrace();
											}
										}
								}
							}
						}.start();
							// 发送数据
							InputStreamReader input = new InputStreamReader(
									System.in);// 属于阻塞方法
							BufferedReader br = new BufferedReader(input);
							String outN;
							try {
								outN = br.readLine();
								socket.getOutputStream().write(outN.getBytes());
								System.out.println("服务端已发送");
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							if(socket.isClosed()){
								break;
							}							
						}				
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		public static void main(String[] args) {
			new SocketServer().sockets();
		}
	}
/**
*客户端程序
*/
	package cjy.com;

	import java.io.BufferedInputStream;
	import java.io.BufferedReader;
	import java.io.IOException;
	import java.io.InputStream;
	import java.io.InputStreamReader;
	import java.io.OutputStream;
	import java.net.Socket;
	import java.net.UnknownHostException;

	public class SocketClient {

		Socket socket=null;
		InputStreamReader input = null;
		InputStream in = null;
		OutputStream out = null;
		byte[] b = new byte[1024];
		/**
		 * @param args
		 */
		public  void socketStart(){
			try {
				socket = new Socket("服务器端ip地址",8888);
				out = socket.getOutputStream();
				while(true){
					input = new InputStreamReader(System.in);
					String name = new BufferedReader(input).readLine();
					out.write(name.getBytes());
					if("bye".equals(name)){
						break;
					}
					System.out.println("已发送");
					//接受返回数据
					new Thread(){
						public void run(){
							try {
								while(true){
									in =socket.getInputStream();
									int n = in.read(b);
									System.out.println("返回数据:"+new String(b,0,n) );
								}
							} catch (IOException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
					}.start();
				}
				
			} catch (UnknownHostException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}finally{
				try {
					//关闭流和连接
					in.close();
					out.close();
					socket.close();
		   } catch (Exception e2) {}
	}
		}
		public static void main(String[] args) {
			// TODO Auto-generated method stub
			new SocketClient().socketStart();
		}

	}




  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值