Socket通信

1.通信原理

服务器端 1.先建立一个ServerSocket,等待客户端连接

                2.当有客户端连接时,建立连接,为连接多个客户端,我们创建一个线程处理客户端发来的请求

                3.完成通信后,服务器关闭此连接

    //根据端口号实例化ServerSocket类的一个对象
    ServerSocket server = new ServerSocket(8888);
	while(flag){
	// 等待客户机连接进入,进入后实例化一个客户机Socket对象		
		Socket client = server.accept();
		System.out.println("客户机连接成功,客户机的地址是:"
					+ client.getRemoteSocketAddress());
		//当有客户机接入时创建线程
		Clientuser user=new Clientuser(client,jta);
		user.start();

 客户端:1.根据服务器ip地址和端口号创建Socket

                2.连接成功后创建线程处理连接

                3.通信完成后断开连接

try {
	client =new Socket("192.168.1.158",9999);
	os=client.getOutputStream();
	is=client.getInputStream();
	Clienter clienter=new Clienter(client);
	clienter.start();
		} 
		 catch (Exception e) {
			e.printStackTrace();
		}

  2.通信协议

通信协议说白了就是你指定的发送数据和接受数据的规则。

例如发消息时,你可以指定先发送int说明消息的总长度,再发送一个字节长度的数据来表示你发送的是消息不是其他的,再发送int说明接受者的id,最后发送消息体;接收的时候你也按照这个规则依次读取信息。

发文件时,你可以先发送一个int表示文件名,然后再把文件循环读取到固定长度的缓冲区发给服务器,直到读取到文件末尾,这样无论多大的文件都可以发送,发送时间长短就要看你的网速了,昨天在蓝杰测试发个100多k的图片发了好久

(1)一个登陆请求代码示例:

public String login(String msg){ 
		String user_name = this.username.getText().toString();
		String  pass_word = this.password.getText().toString();
		try {
			byte []data1 = user_name.getBytes();
			byte []data2 = pass_word.getBytes();
			int total_len = 4+1+4+data1.length+data2.length;
			int name_len = data1.length;
			dataout.writeInt(total_len);
			dataout.writeByte(1);
			dataout.writeInt(name_len);
			dataout.write(data1);
			dataout.write(data2);
			dataout.flush();
			msg = bufferin.readLine();
			System.out.println(msg+"hhhhhhhh");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return msg;
	}

 (2)登录验证代码示例:

public void process_login(int total_len) throws SQLException {
		try {
			int name_len = dis.readInt();
			byte[] data1 = new byte[name_len];
			byte[] data2 = new byte[total_len - 9 - name_len];
			dis.read(data1);
			dis.readFully(data2);
			String username = new String(data1);
			String password = new String(data2);
			System.out.println(username + " ");
			System.out.println(password);
			// 获取验证结果信息
			String msg  = query(username, password);
			if (msg.equals("验证已通过")) {
				sendMsg("验证已通过");
				System.out.println("验证已通过");
			}
			if (msg.equals("密码输入错误")) {
				sendMsg("密码输入错误");
				System.out.println("密码输入错误");
			}
			if (msg.equals("用户不存在")) {
				sendMsg("用户不存在");
				System.out.println("用户不存在");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

 (3)关于文件的传输我写了个测试程序,详情见附件,欢迎下载

         由于程序中我指定默认保存在D盘Download下所以你要有这个文件夹

猜你喜欢

转载自614990713.iteye.com/blog/2092540