需求:
经过客户端键盘录入用户名,实现登陆。
服务端对客户端的发送过来的用户名进行校验。
若是该用户存在,服务端显示用户登陆,并回馈给客户端欢迎光临。
若是该用户不存在,服务端显示用户尝试登陆,并回馈给客户端,该用户不存在。java
另外,客户端最多只能尝试登陆三次。
服务端也同样做此限定。服务器
效果图(左图为客户端,右图为服务器端):多线程
思路:并发
客户端:
1,创建socket服务。
2,读取键盘录入。
3,将录入的一个用户名数据经过socket的输出发出,给服务端。
4,发出后,要读取服务端回馈的信息。
5,判断该信息,若是有欢迎字样表示登陆成功,用户名输入结束。
由于操做的是文本,因此可使用字符流。并加上缓冲提升效率。socket
服务端:
1,创建socket服务。
2,不断获取客户端对象。
3,将客户端对象封装到单独的线程中。
4,限定判断次数。
5,读取本地用户文件列表,对获取的用户名进行校验。
6,根据校验结果给出响应信息。this
完整代码:spa
总结:其实服务器就是相似这样一种程序,当用户请求服务器的时候,它首先会建立socket服务,这样客户端才能连上,第二步把客户端拿到的对象封装成线程,第三步进行数据的传输,服务端底层就是用的这三个技术socket,多线程,io,每一个客户端去请求都会作这三个事情,咱们就不用去写它了,服务器提供了更简单的对象让你去用。.net
服务器的做用就一个,不断的去处理客户端的请求并给客户端的请求有相应的应答。线程
------------------------------------------------------------------------------------------------------------------------code
实现思路:
在客户端获取到文件流,将文件流写入到经过socket指定到某服务器的输出流中,在服务器中经过socket获取到输入流,将数据写入到指定的文件夹内,为了提供多用户同时上传,这里须要将在服务器上传客户端的文件操做放在另开启一个线程去运行。
完整代码:
import java.net.*; import java.io.*; /* 服务端将获取到的客户端封装到单独的线程中。 */ class JpgClient2 { public static void main(String[] args) throws Exception { //检验文件 if(args.length==0) { System.out.println("指定一个jpg文件先!"); return ; } File file = new File(args[0]); if(!(file.exists() && file.isFile() && file.getName().endsWith(".jpg"))) { System.out.println("选择文件错误,请从新选择一个正确的文件。"); return ; } //读取文件并写入到服务器中 Socket s = new Socket("192.168.137.199",9006); 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); String str = new String(bufIn,0,num); System.out.println(str); fis.close(); s.close(); } } class JpgThread implements Runnable { private Socket s; JpgThread(Socket s) { this.s = s; } public void run() { int count = 1; String ip = s.getInetAddress().getHostAddress(); try { //获取客户端数据 InputStream in = s.getInputStream(); //指定文件存放路径将读取到客户提交的数据写入文件中 File dir = new File("c:\\pic"); 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) { System.out.println(e.toString()); } } } class JpgServer2 { public static void main(String[] args)throws Exception { ServerSocket ss = new ServerSocket(9006); //开启线程并发访问 while(true) { Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"....connected"); new Thread(new JpgThread(s)).start(); } } }