1、TCP特点:
面向连接、可靠安全、传输量大、速度较慢
2、socket编程主要依靠两个类:socket 、serversocket
example1:客户端可以不停输入字符串,服务端返回字符串的大写
客户端代码:
1 public static void main(String[] args) throws Exception{ 2 //建立socket连接 连接一旦建立成功 就可以获得 输入流 和 写出流 3 Socket s = new Socket(InetAddress.getLocalHost(),10001); 4 //客户端从键盘输入字符 5 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 6 //从服务端获取的输入流,可以获取从服务端返回的信息 7 BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 8 //写出流 方式一 把信息发送到服务端 9 PrintWriter pw = new PrintWriter(s.getOutputStream(),true);10 //写出流 方式二11 //BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));12 13 String line = null;14 while((line=br.readLine())!=null){15 //写到服务端 方式一16 pw.println(line);17 //写到服务端 方式二18 /*19 bw.write(line);20 bw.newLine();21 bw.flush();22 */23 //读取服务端返回信息(这是一个阻塞方法)24 String result = in.readLine();25 26 System.out.println(result);27 }28 s.close();29 br.close();30 }
服务端代码:
1 public static void main(String[] args) throws Exception {2 ServerSocket ss = new ServerSocket(10001);3 while(true){4 //此方法是阻塞式方法5 Socket s = ss.accept();6 //服务端这儿需要使用线程 每次接受一个客户端就为其开启一个线程,防止多个客户端访问出现阻塞情况7 new Thread(new ServerThread(s)).start();8 }9 }
1 class ServerThread implements Runnable{ 2 3 private Socket socket; 4 5 public ServerThread(Socket socket) { 6 this.socket = socket; 7 } 8 9 @Override10 public void run() {11 try {12 System.out.println(socket.getInetAddress().getHostAddress()+"is connecting");13 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));14 PrintWriter pw = new PrintWriter(socket.getOutputStream(),true);15 String line =null;16 while((line = br.readLine())!=null){17 //如果接收到结束标志 则结束18 if("over".equals(line)){19 break;20 }21 System.out.println(line);22 pw.println(line.toUpperCase());23 }24 } catch (IOException e) {25 // TODO Auto-generated catch block26 e.printStackTrace();27 }28 29 }30 }
Example2:上传文件——客户端将文件内容写到服务端,服务端 将内容保存到其他位置,实现从服务端上传文件的功能
客户端代码:
1 public static void main(String[] args) throws Exception { 2 Socket s = new Socket(InetAddress.getLocalHost(),10001); 3 BufferedReader br = new BufferedReader(new FileReader(new File("D:/baichuanyu/HelloWorld/src/com/action/Hello.java"))); 4 BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 5 PrintWriter pw = new PrintWriter(s.getOutputStream(),true); 6 String line = null; 7 while((line=br.readLine())!=null){ 8 pw.println(line); 9 }10 //文件内容写到服务器完成后,服务端没有接受到结束标志,会继续readline()下去11 //通过shutdownOutput()方法 可以向服务器写-1结束标志 从而结束服务端的readline()方法12 s.shutdownOutput();13 String result = in.readLine();14 System.out.println(result);15 s.close();16 br.close();17 }
服务端代码:
1 class UploadThread implements Runnable{ 2 3 private Socket socket; 4 5 public UploadThread(Socket socket) { 6 this.socket = socket; 7 } 8 9 @Override10 public void run() {11 try {12 System.out.println(socket.getInetAddress().getHostAddress()+" is connecting....");13 BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));14 PrintWriter pw = new PrintWriter(new FileWriter(new File("E:\\Hello.txt")),true);15 PrintWriter os = new PrintWriter(socket.getOutputStream(),true);16 String line =null;17 while((line = br.readLine())!=null){18 pw.println(line);19 }20 os.println("over");21 pw.close();22 } catch (IOException e) {23 // TODO Auto-generated catch block24 e.printStackTrace();25 }26 27 }28 }
1 public static void main(String[] args) throws Exception {2 ServerSocket ss = new ServerSocket(10001);3 while(true){4 //此方法是阻塞式方法5 Socket s = ss.accept();6 //服务端这儿需要使用线程 每次接受一个客户端就为其开启一个线程,防止多个客户端访问出现阻塞情况7 new Thread(new UploadThread(s)).start();8 }9 }