TCP(Socket基础编程)

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     @Override
10     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 block
26             e.printStackTrace();
27         }
28         
29     }
30 }
View Code

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     @Override
10     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 block
24             e.printStackTrace();
25         }
26         
27     }
28 }
View Code
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      }
原文地址:https://www.cnblogs.com/Wen-yu-jing/p/4077918.html