java网络编程3-tcp编程

tcp 的特点

1,服务端和客户端基于serveraSocket 形成一个连接

2,基于请求和响应模式,(第一次发起请求的叫客户端,第一次响应请求的叫服务端)

3, 使用io流进行传输

4,稳定,安全,消耗大

5,客户端的输出流,就是服务端的输入流;服务端的输出流,就是客户端的输入流;

*********************

服务端 (为什么没有用lambda表达式来写线程体,因为不好维护)


package networkCoding;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 * 1, 指定端口,使用serverSocket创建服务器
 * 2, 阻塞式等待连接accept
 * 3, 操作:输入输出流操作
 * 4, 释放资源
 * 
 * **/

public class TcpSever {
	
	public static void main(String[] args) throws IOException {
		System.out.println("----server-----");
		 //1, 指定端口,使用serverSocket创建服务器
		ServerSocket server = new ServerSocket(8888);
		
		boolean isRunning= true;
		while(isRunning) {
			Socket client = server.accept();
			new Thread(new Talk(client)).start();
		}
		server.close();
	}
	
	
	static class Talk implements Runnable{
		private DataInputStream dis;
		private Socket client;
		private DataOutputStream dos;
		String uname= "";
		String pwd="";
		public Talk( Socket client) {
			try {
				this.client =client;
				this.dis= new DataInputStream(client.getInputStream());
				this.dos= new DataOutputStream(client.getOutputStream());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		public void run() {
				String	dataString = this.receiveData();
				for (String string : dataString.split("&")) {
					String[] quStrings=string.split("=");
					String first= quStrings[0];
					String sec=quStrings[1];
					if(first.equals("uname")){
						this.uname=sec;
					}else {
						this.pwd=sec;
					}
				}
				if(uname.equals("wangrong")&&pwd.equals("wangrong")) {
					this.writeData("登录成功");
				}else {
					this.writeData("登录失败");
				} 	
				
			 // 4, 释放资源
				this.release() ;

			
		}
		private String receiveData() {
			String data="";
			try {
				data=dis.readUTF();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
					
			return data;		
		}
		private void writeData(String msg) {
			try {
				dos.writeUTF(msg);
				dos.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		private void release() {
			try {
				if(null!=dos) {
					dos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				if(null!=dis) {
					dis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if(null!=client) {
					client.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
		
	}

}

客户端

package networkCoding;

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * 
 * 1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;
 * 2, 操作:输入输出流操作
 * 3, 释放资源
 * 
 * **/

public class TcpClient {
	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("----client-----");
		 // 1, 建立连接,使用socket 创建客户端 + 服务端的地址端口号;
		Socket client = new Socket("localhost",8888);
		TalkClient tClient=new TalkClient(client);
		tClient.writeData();
		 // 2, 操作:输入输出流操作 
		String backString=tClient.receiveData();
		System.out.println(backString);
		 // 3, 释放资源
	}
	
	static class TalkClient{
		private DataInputStream dis;
		private Socket client;
		private DataOutputStream dos;
		String datas="";
		public TalkClient( Socket client) {
			try {
				this.client =client;
				this.dis= new DataInputStream(client.getInputStream());
				this.dos= new DataOutputStream(client.getOutputStream());
				datas=this.init();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		private String init() {
			BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
			System.out.println("请输入用户名");
			String uname="";
			String pwd="";
			try {
				uname = bf.readLine();
				System.out.println("请输入密码");
				pwd= bf.readLine();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			return "uname="+uname+"&pwd="+pwd;
		}
		
		private String receiveData() {
			String data="";
			try {
				data=dis.readUTF();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
					
			return data;		
		}
		private void writeData() {
			try {
				dos.writeUTF(this.datas);
				dos.flush();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		}
		
		private void release() {
			try {
				if(null!=dos) {
					dos.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			try {
				if(null!=dis) {
					dis.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			try {
				if(null!=client) {
					client.close();
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		
		
		
	}
}
发布了189 篇原创文章 · 获赞 10 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/wangrong111222/article/details/103229331