网络编程之TCP编程案例

需求1:请上传张图片到服务器。

  客户端:

public static void main(String[] args) {
		System.out.println("客户端启动。。。");
		try {
			Socket socket=new Socket("127.0.0.1",8000);
			
			File file=new File("d:\\sxt2019\\danta.jpg");
			
			FileInputStream fileInputStream=new FileInputStream(file);
			OutputStream outputStream=socket.getOutputStream();
			
			
			byte[] buf=new byte[512];
			int len;
			while((len=fileInputStream.read(buf))!=-1){
				outputStream.write(buf, 0, len);
			}
			
		
			fileInputStream.close();
			outputStream.close();
			
		} catch (UnknownHostException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}

  

 

  服务器:

public static void main(String[] args) {
		System.out.println("服务器启动。。。");
		try {
			ServerSocket serverSocket=new ServerSocket(8000);
			Socket accept = serverSocket.accept();
			
			InputStream inputStream=accept.getInputStream();
			
			File file=new File("d:\\sxt2019\\abc\\danta.jpg");
			FileOutputStream fileOutputStream=new FileOutputStream(file);
			
			int len;
			byte[] buf=new byte[512];
			while((len=inputStream.read(buf))!=-1){
				fileOutputStream.write(buf, 0, len);
			}
			
			
			inputStream.close();
			fileOutputStream.close();
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

  

需求2:在控制台输入用户名和密码,如果输入正确提示登录成功,否则登录失败。

  User表:

package Day7.test03;

import java.io.Serializable;

public class User implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private String username;
	private String password;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}

	public User(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

}

  

    注意:服务器和客户端是分别运行在两个Eclipse上的。那么,表的工作路径,即第一行的包名,在服务器端和客户端两边的包名都要一致。否则当一边序列化对象后,另一边无法反序列化到对象,会报错。

 

 

  服务器:

public static void main(String[] args) {
		System.out.println("服务器启动。。。");
		try {
			ServerSocket serverSocket=new ServerSocket(9000);
			Socket accept = serverSocket.accept();
			
			//1.从客户端获取账号密码
			InputStream inputStream=accept.getInputStream();
			ObjectInputStream objectInputStream=new ObjectInputStream(inputStream);			
			User user = (User) objectInputStream.readObject();									
			String username = user.getUsername();
			String password = user.getPassword();
			
			String msg;
			if(username.equals("sxt") && password.equals("123")){
				msg ="恭喜,登陆成功!";
			}else {
				msg="用户名或密码错误!";
			}
			accept.shutdownInput();
			
			
			//2.向客户端传输提示信息
			OutputStream outputStream = accept.getOutputStream();
			DataOutputStream dataOutputStream=new DataOutputStream(outputStream);
			dataOutputStream.writeUTF(msg);
			accept.shutdownOutput();
			
			
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		

	}

  

 客户端:

public static void main(String[] args) {
		System.out.println("客户端启动。。。");
		try {
			
			
			Scanner scanner=new Scanner(System.in);
			System.out.println("请输入用户名:");
			String username = scanner.nextLine();						
			System.out.println("请输入密码:");
			String password = scanner.nextLine();			
			User user=new User(username, password);	
			
			Socket socket=new Socket("127.0.0.1",9000);
			
			
			//1.向服务器传输账号密码
			OutputStream outputStream=socket.getOutputStream();
			ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
			objectOutputStream.writeObject(user);
			socket.shutdownOutput();
			
			//2.从服务器返回提示信息
			InputStream inputStream=socket.getInputStream();		
			DataInputStream dataInputStream=new DataInputStream(inputStream);
			String msg=dataInputStream.readUTF();
			System.out.println("提示信息:"+msg);
			socket.shutdownInput();
			
			
			
		
			
			
			
		} catch (UnknownHostException e) {			
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		}
		
	}

  

在需求2的基础上,需求3:把服务器放到线程中,当程序启动后,服务器会一直工作。

  服务器:

public static void main(String[] args) throws IOException {
		System.out.println("服务器启动。。。");
		ServerSocket serverSocket = new ServerSocket(9000);

		while (true) {
			Socket accept = serverSocket.accept();
			LoginThread loginThread = new LoginThread(accept);
			loginThread.start();
		}
	}

  

  线程:

public class LoginThread extends Thread {

	private Socket socket;

	public LoginThread(Socket socket) {
		super();
		this.socket = socket;
	}

	@Override
	public void run() {
		try {

			// 1.从客户端获取账号密码
			InputStream inputStream = socket.getInputStream();
			ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
			User user = (User) objectInputStream.readObject();
			String username = user.getUsername();
			String password = user.getPassword();

			String msg;
			if (username.equals("sxt") && password.equals("123")) {
				msg = "恭喜,登陆成功!";
			} else {
				msg = "用户名或密码错误!";
			}
			socket.shutdownInput();

			// 2.向客户端传输提示信息
			OutputStream outputStream = socket.getOutputStream();
			DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
			dataOutputStream.writeUTF(msg);
			socket.shutdownOutput();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

  

  客户端:

public static void main(String[] args) {
		System.out.println("客户端启动。。。");
		try {
			
			
			Scanner scanner=new Scanner(System.in);
			System.out.println("请输入用户名:");
			String username = scanner.nextLine();						
			System.out.println("请输入密码:");
			String password = scanner.nextLine();			
			User user=new User(username, password);	
			
			Socket socket=new Socket("127.0.0.1",9000);
			
			
			//1.向服务器传输账号密码
			OutputStream outputStream=socket.getOutputStream();
			ObjectOutputStream objectOutputStream=new ObjectOutputStream(outputStream);
			objectOutputStream.writeObject(user);
			socket.shutdownOutput();
			
			//2.从服务器返回提示信息
			InputStream inputStream=socket.getInputStream();		
			DataInputStream dataInputStream=new DataInputStream(inputStream);
			String msg=dataInputStream.readUTF();
			System.out.println("提示信息:"+msg);
			socket.shutdownInput();
			
			
			
			
			
		} catch (UnknownHostException e) {			
			e.printStackTrace();
		} catch (IOException e) {			
			e.printStackTrace();
		}
		
	}

  

 

posted @ 2019-05-10 23:22  luojack  阅读(391)  评论(0编辑  收藏  举报