TCP使用(二)多用户发送文件和登录

 

服务器端接收多个客户端同时发送的文件

血的教训:

在服务器端未添加while (true) {Socket s = ss.accept();new Thread(new MyThread(s)).start();} 

 导致程序运行的次,服务器端就关闭

 

 

客户端:

	
	public static void main(String[] args)throws Exception 
	{




		File file = new File("c:\\QQ.jpg");
		if(!(file.exists() && file.isFile()))
		{
			return ;

		}

		if(!file.getName().endsWith(".jpg"))
		{
			return ;
		}

		if(file.length()>1024*1024*5)
		{
			return ;
		}
		



		Socket s = new Socket("192.168.1.117",10009);

		FileInputStream fis = new FileInputStream(file);

		OutputStream out = s.getOutputStream();

		byte[] buf = new byte[1024];

		int len = 0;

		while((len=fis.read(buf))!=-1)
		{
			out.write(buf,0,len);
		}

		s.shutdownOutput();

		InputStream in = s.getInputStream();

		byte[] bufIn = new byte[1024];

		int num = in.read(bufIn);
		System.out.println(new String(bufIn,0,num));

		fis.close();
		s.close();
	}

服务器端:

	public static void main(String[] args) throws IOException {

		ServerSocket ss = new ServerSocket(10009);
		while (true) {
			Socket s = ss.accept();
			new Thread(new MyThread(s)).start();
		}
	}
public class MyThread implements Runnable {

	Socket s;

	public MyThread(Socket s) {
		super();
		this.s = s;
	}

	public void run() {

		int count = 1;
		String ip = s.getInetAddress().getHostAddress();
		try {
			System.out.println(ip + "....connected");

			InputStream in = s.getInputStream();

			File dir = new File("d:\\pic");
			dir.mkdirs();

			File file = new File(dir, ip + "(" + (count) + ")" + ".jpg");

			while (file.exists())
				file = new File(dir, ip + "(" + (count++) + ")" + ".jpg");

			FileOutputStream fos = new FileOutputStream(file);

			byte[] buf = new byte[1024];

			int len = 0;
			while ((len = in.read(buf)) != -1) {
				fos.write(buf, 0, len);
			}

			OutputStream out = s.getOutputStream();

			out.write("上传成功".getBytes());

			fos.close();

			s.close();
		} catch (Exception e) {
			throw new RuntimeException(ip + "上传失败");
		}
	}
}


 

TCP验证多用户登录:

示例:

说明:服务器端同时验证多个用户登录,限制登录三次,客户端控制台输入用户名进行登录

 血的教训:

在使用printWriter的时候 new PrintWriter(os,true);第二个值为true的时候,使用方法println()会自动刷入数据。

如果使用writer()方法还需要flush()手动刷入,并且该方法无法自动加入换行符

 客户端:

public class Demo25 {
	public static void main(String[] args) throws IOException {

		try {
			Socket s = new Socket("192.168.1.117", 10009);

			BufferedReader bwIn = new BufferedReader(new InputStreamReader(s
					.getInputStream()));

			BufferedReader brSys = new BufferedReader(new InputStreamReader(
					System.in));

			BufferedWriter bwOut = new BufferedWriter(new OutputStreamWriter(s
					.getOutputStream()));

			for (int i = 0; i < 3; i++) {
				String name = brSys.readLine();
				System.out.print(name);
				if (name == null) {
					System.out.println("用户名不能为空");
				}
				bwOut.write(name);
				bwOut.newLine();
				bwOut.flush();

				String request = bwIn.readLine();
				System.out.println(request);

			}
			System.out.println("登录超过三次,自动退出");
			// bwOut.close();
			s.close();

		} catch (IOException e) {
			e.printStackTrace();
		}

	}

}

服务器端:

public class Demo26 {
	public static void main(String[] args) {

		try {
			ServerSocket ss = new ServerSocket(10009);
			while (true) {
				Socket s = ss.accept();
				new Thread(new Demo26Thread(s)).start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
}
public class Demo26Thread implements Runnable {
	public Socket s;

	public Demo26Thread(Socket s) {
		super();
		this.s = s;
	}

	public void run() {
		try {

			BufferedReader br = new BufferedReader(new InputStreamReader(s
					.getInputStream()));

			PrintWriter pw = new PrintWriter(s.getOutputStream(),true);

			boolean isLogin = false;
			for (int i = 0; i < 3; i++) {
				String name = br.readLine();
				System.out.println("Server:" + name);
				String loginName = null;
				
				BufferedReader brFile = new BufferedReader(
						new InputStreamReader(new FileInputStream(
								"D:\\login.txt")));
				while ((loginName = brFile.readLine()) != null) {
					isLogin = name.equals(loginName);
					if (isLogin) {
						break;
					}
				}
				if (isLogin) {
					System.out.println(name + "isLogin");
//					pw.println("Login Success");
					pw.write("Login Success\r\n");
					break;
				} else {
					pw.write("Login defeated\r\n");
//					pw.println("Login defeated");
				}
				pw.flush();

			}
			pw.close();
			s.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// TODO Auto-generated method stub

	}
}



 

 


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值