tcp通信

2.创建ServerSocket的同时向系统申请对外的服务端口。注意, 该端口不能和其他程序冲突,否则会抛出地址被占用的异常

3.运行在服务端的服务端接口,客户端就是通过这个端口与服务端建立连接的。

监听服务端口,等待客户端连接。一旦一个客户端通过Socket与服务端建立连接,那么serversocket

会创建一个socket与该客户端通讯。

4.ServerSocket提供方法:

Socket accept()
 该方法是一个阻塞方法,调用后即等待客户端的链接;一旦一个
 客户端连接,那么accept方法就会返回一个Socket实例,通过
 这个实例就可以与刚连接的客户端交互了

5.Socket,ServerSocket的对象可以在类的构造中创建。服务端创建ServerSocket,通过server.accept()监听客户端,客户端创建Socket。

 

一、向服务端发送一句:你好,客户端

服务端代码:

package day01;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务端
 * @author TEDU
 *
 */
public class Server {
    private ServerSocket server;
    public Server() throws IOException{
        //初始化服务端,参数为监听的端口号
        server=new ServerSocket(8098);
    }
    public void start(){
        try {
            System.out.println("等待客户端连接");
            Socket socket=server.accept();//监听客户端,此时进入阻塞状态
            System.out.println("一个客户端已连接");//表示已经完成了客户端的连接
            while(true){//当客户端连接后会自动停止,while true让服务端一直接收消息状态
                InputStream nm=socket.getInputStream();
                InputStreamReader mo=new InputStreamReader(nm,"UTF-8");
                BufferedReader bi=new BufferedReader(mo);
                String st=bi.readLine();
                if(st!=null){//信息如果不筛选就会在控制台一直输出null
                    System.out.println("客户端说:"+st);
                }
                
            }
        } catch (IOException e) {
        
            e.printStackTrace();
        }
    }
public static void main(String[] args){
    try {
        Server a=new Server();
        a.start();//启动程序
        
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

客户端代码:

package day01;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * 客户端
 * @author TEDU
 *
 */
public class Client {
    private Socket socket;
    public Client(){
        try {
            socket=new Socket("localhost",8098);
            System.out.println("连接服务器成功");
        } catch (UnknownHostException e) {
            
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public void start(){
        try {
            OutputStream in=socket.getOutputStream();
            OutputStreamWriter oi=new OutputStreamWriter(in,"UTF-8");
            PrintWriter an=new PrintWriter(oi,true);
            String st="你好客户端";
            an.println(st);
            socket.close();//如果不关闭socket会导致异常
        } catch (Exception e) {
        }
    }
public static void main(String[] args) {
    try {
        Client client=new Client();
        client.start();
    } catch (Exception e) {
        System.out.println("客户端启动失败");
    }
}
}

二、通过控制台向服务端发消息

客户端代码:

(服务端代码不变)

package day01;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
/**
 * 客户端
 * @author TEDU
 *
 */
public class Client {
	private  Socket socket;
	Scanner scan;
	public Client(){
		try {
			socket=new Socket("localhost",8098);
			System.out.println("连接服务器成功");
		} catch (UnknownHostException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	public void start(){
		try {
			System.out.println("开始聊天吧");
			scan=new Scanner(System.in);
			while(true){
				OutputStream in=socket.getOutputStream();
				OutputStreamWriter oi=new OutputStreamWriter(in,"UTF-8");
				PrintWriter an=new PrintWriter(oi,true);
				String st=scan.nextLine();
				an.println(st);
				
			}
			
		} catch (Exception e) {
		}
		try {
			socket.close();
			scan.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}//如果不关闭socket会导致异常
	}
public static void main(String[] args) {
	try {
		Client client=new Client();
		client.start();
		
		
	} catch (Exception e) {
		System.out.println("客户端启动失败");
	}
}
}

  

posted @ 2018-08-17 20:50  那年丶青春无痕  阅读(147)  评论(0编辑  收藏  举报