服务器端:
1:创建ServerSocket对象,绑定监听端口
2:通过accept()方法监听客户端请求
3:连接建立后。通过输入流InputStream读取客户端的请求信息
4:通过输入流向客户端发送响应信息
5:关闭相关资源
客户端:
1:创建Socket对象,指明需要连接的服务器的地址和端口号
2:连接建立后,通过输出流向服务器端发送请求信息
3:通过输入流获取服务器响应的信息

4:关闭资源


服务器端:::

package TCP;

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

public class Service1 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//第一步 :建立服务器端serverSocket
        ServerSocket service=new ServerSocket(8888);
        Socket socket=null;
        System.out.println("服务器端正在等待客户端响应!!!");
        //第二步:监听此端口 ,并返回一个Socket 
        socket=service.accept();
        //第三步:获取输入流  通过输入流读取客户端请求
        InputStream is=socket.getInputStream();
        InputStreamReader isr=new InputStreamReader(is);
        BufferedReader br=new BufferedReader(isr);
        String info=null;
        while((info=br.readLine())!=null){
        	System.out.println("服务器端接收客户端的数据为:"+info);
        }
        socket.shutdownInput();
     /*
      * ----------------------
      * 响应客户端请求
      */
      OutputStream os=socket.getOutputStream();
        PrintWriter pw=new PrintWriter(os);
        pw.write("欢迎你:小伙子");
        pw.flush();
        pw.close();
        os.close();
        
        
        br.close();
        isr.close();
        is.close();
        socket.close();
        service.close();
        
	}

	
	
}



客户端:::

package TCP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client1 {

	public static void main(String[] args) throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
		//第一步:创建socket指明需要接收的的端口和主机
      Socket socket=new Socket("localhost",8888);
      //第二步:通过输出流发送请求
      OutputStream os=socket.getOutputStream();
      PrintWriter pw=new PrintWriter(os);
      pw.write("用户名:admin 密码:123");
      pw.flush();
      
     socket.shutdownOutput();
      
      /*
       * --------
       * 获取服务器端响应信息
       */
         InputStream is=socket.getInputStream();
    	 BufferedReader br=new BufferedReader(new InputStreamReader(is));  
         String info=null;
         while((info=br.readLine())!=null){
        	 System.out.println("服务器响应说:"+info);
         }
       is.close();
       br.close();
       pw.close();
       os.close();
       socket.close();
       
      
		
		
		
		
		
	}

}


注意:

资源的关闭:打开的顺序和关闭的顺序是相反的   最先打开什么  最后关闭什么 不然容易出现connection reset等错误

PrintWriter输出流必须flush一下  不然在服务器端看不到输出流的字符串

先启动服务器端  再启动客户端

socket,getInputStream /outputStream获取的是字节流


如何用多线程实现一个服务器端   多个客户端::::

服务器端::

package TCP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Service1 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//第一步 :建立服务器端serverSocket
        ServerSocket service=new ServerSocket(8888);
        Socket socket=null;
        System.out.println("服务器端正在等待客户端响应!!!");
       int count=0;
       while(true){
    	   //第二步:监听此端口 ,并返回一个Socket 
    	   socket=service.accept();
    	   SocketThread1 socketthread=new SocketThread1(socket);
    	   socketthread.start();
    	   count++;
    	   System.out.println("客户端的数量:"+count);
			InetAddress address=socket.getInetAddress();
			System.out.println("当前客户端的IP:"+address.getHostAddress());
       }
        
        
	}

	
	
}



客户端:::

package TCP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client1 {

	public static void main(String[] args) throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
		//第一步:创建socket指明需要接收的的端口和主机
      Socket socket=new Socket("localhost",8888);
      //第二步:通过输出流发送请求
      OutputStream os=socket.getOutputStream();
      PrintWriter pw=new PrintWriter(os);
      pw.write("用户名:admin 密码:123");
      pw.flush();
      
     socket.shutdownOutput();
      
      /*
       * --------
       * 获取服务器端响应信息
       */
         InputStream is=socket.getInputStream();
    	 BufferedReader br=new BufferedReader(new InputStreamReader(is));  
         String info=null;
         while((info=br.readLine())!=null){
        	 System.out.println("服务器响应说:"+info);
         }
       is.close();
       br.close();
       pw.close();
       os.close();
       socket.close();
       
      
		
		
		
		
		
	}

}




线程处理类:::

package TCP;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketThread1 extends Thread{
	private Socket socket=null;
	
	public SocketThread1(Socket socket){
		this.socket=socket;
	}
	public void run(){
		InputStream is=null;
		 BufferedReader br=null;
		 InputStreamReader isr=null;
		 OutputStream os=null;
		 PrintWriter pw=null;
		try {
			is = socket.getInputStream();
            isr=new InputStreamReader(is);
               br=new BufferedReader(isr);
        String info=null;
        while((info=br.readLine())!=null){
        	System.out.println("服务器端接收客户端的数据为:"+info);
        }
        socket.shutdownInput();
     /*
      * ----------------------
      * 响应客户端请求
      */
       os=socket.getOutputStream();
        pw=new PrintWriter(os);
        pw.write("欢迎你:小伙子");
     
        pw.flush();
        pw.close();
        os.close();
        
        
        br.close();
        isr.close();
        is.close();
        socket.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
		finally{
			//关闭资源
			try {
				if(pw!=null)
					pw.close();
				if(os!=null)
					os.close();
				if(br!=null)
					br.close();
				if(isr!=null)
					isr.close();
				if(is!=null)
					is.close();
				if(socket!=null)
					socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}}}



多启动几个客户端就可以查看效果