Day 22:网络编程(3)

TCP通讯协议特点:
   1. tcp是基于IO流进行数据 的传输的,面向连接。
   2. tcp进行数据传输的时候是没有大小限制的。
   3. tcp是面向连接,通过三次握手的机制保证数据的完整性。可靠协议。
   4. tcp是面向连接的,所以速度慢。
   5. tcp是区分客户端与服务端的。

tcp协议下的Socket:
   Socket(客户端) , tcp的客户端一旦启动马上要与服务端进行连接。
   ServerSocket(服务端类)
 
tcp的客户端使用步骤:
   1. 建立tcp的客户端服务。
   2. 获取到对应的流对象。
   3.写出或读取数据
   4. 关闭资源。
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(),9090);
        OutputStream a = socket.getOutputStream();
        a.write("客户端说 :".getBytes());
        socket.close();
    }
}

 

 
tcp的服务端使用步骤
   java.net.BindException:   端口被占用。
  ServerSocket的使用 步骤
     1. 建立tcp服务端的服务。
     2. 接受客户端的连接产生一个Socket.
     3. 获取对应的流对象读取或者写出数据。
     4. 关闭资源。
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        ServerSocket socket = new ServerSocket(9090);
        Socket s = socket.accept();
        InputStream b = s.getInputStream();
        byte[] buf = new byte[1024];
        int length = 0;
        length = b.read(buf);
        System.out.println("服务端接收:"+ new String(buf,0,length));
        
        OutputStream outputStream = s.getOutputStream();
        outputStream.write("客户端你好啊!".getBytes());
        
        socket.close();
    }
}

 需求: 客户端与服务端一问一答聊天。
 
 1.如果使用BuffrerdReader的readline方法一定要加上\r\n才把数据写出。
 2.使用字符流一定要调用flush方法数据才会写出。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Demo4 {

    public static void main(String[] args) throws IOException {
        Socket socket = new Socket(InetAddress.getLocalHost(),9090);
        OutputStreamWriter socketOut =    new OutputStreamWriter(socket.getOutputStream());
        BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));
        
        String line = null;
        while((line = keyReader.readLine())!=null){
            
            socketOut.write(line+"\r\n");
            socketOut.flush();
            
            line = socketReader.readLine();
            System.out.println("服务端回送的数据是:"+line);
        }
        socket.close();
    }
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo5 {

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

        ServerSocket serverSocket = new ServerSocket(9090);
        Socket socket = serverSocket.accept();
        BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        OutputStreamWriter socketOut =  new OutputStreamWriter(socket.getOutputStream());
        BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in));

        String line = null;
        while((line = socketReader.readLine())!=null){
            System.out.println("服务端接收到的数据:"+ line);
            System.out.println("输入发给客户端的数据:");
            line = keyReader.readLine();
            socketOut.write(line+"\r\n");
            socketOut.flush();
        }
        serverSocket.close();
    }
}

 模拟Tomcat

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo6 {
    public static void main(String[] args) throws IOException {
        ServerSocket serversocket = new ServerSocket(9090);
        Socket socket = serversocket.accept();
        OutputStream outputStream= socket.getOutputStream();
        outputStream.write("nihao".getBytes());
        serversocket.close();    
    }
}

运行服务器

 

查询本机ip

在浏览器输入IP和端口

因为没有标签所以浏览器不承认这是个网页

 但是服务器已经停止

该段代码只可以被一个人访问,多线程可以让多人访问如下:

import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Demo6 extends Thread{
    Socket socket;
    public Demo6(Socket socket) {
        // TODO Auto-generated constructor stub
        this.socket = socket;
    }
    
    public void run() {
        try {
            OutputStream outputStream= socket.getOutputStream();
            outputStream.write("<html><head><title></title><body>小姐姐,么么哒!</body></head></html>".getBytes());
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }    
    }
    
    public static void main(String[] args) throws IOException {
        ServerSocket serversocket = new ServerSocket(9090);
        while(true) {
            Socket socket = serversocket.accept();
            new Demo6(socket).start();
        }
    }
}

 

 

 
 
posted @ 2018-08-07 12:54  Blizzarrd  阅读(200)  评论(0)    收藏  举报

载入天数...载入时分秒...