网络通信
首先说网络通信,网络通信使用IP地址标识internet上的计算机,使用端口号标识服务器上的进程(程序)。也就是说,如果服务器上的一个程序不占用一个端口号,用户程序就无法找到它,就无法和该程序交互通信。端口号选取大于1023。
当两个程序需要通信时,它们可以通过使用Socket类建立套接字并连接在一起(端口号与IP地址的组合得出一个网络套接字)

套接字
它允许程序把网络连接看成一个流(stream),可以向这个流写字节,也可以从这个流读取字节。
Socket是网络上运行的两个程序间双向通信的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写程序在网络上传递数据。在JAVA中,有专门的Socket类处理用户的请求和响应。利用Socket的方法,就可以实现两台计算机之间的通信。
Socket是网络驱动层提供给应用程序的接口和一种机制。Socket能执行7种基本操作:
1.连接到远程机器
2.绑定到端口
3.接收从远程机器来的绑定端口上的连接
4.监听到达的数据
5.发送数据
6.接收数据
7.关闭连接
套接字有两种:一种套接字在服务器端创建,叫做服务端套接字(ServerSocket);还有一种在客户端被创建,叫做客户端套接字(Socket)。

客户端套接字 
客户端程序使用socket类建立负责连接到服务器的套接字对象。 
Socket的构造方法是Socket(String host, int port),参数host是服务器的IP地址,port是一个端口号。

try{    Socket clientSocket = new Socket("http://192.168.0.78",2010);
}
catch(IOException e){}

当套接字对象clientSocket建立后,可以使用方法getInputStream()获得一个输入流,这个输入流的源和服务器端的一个输出流刚好对应,因此客户端用输入流可以读取服务器写入到输出流中的数据。

ServerSocket对象与服务器端套接字
为了能使客户端成功的连接到服务器,服务器必须建立一个ServerSocket对象(像生活中邮局窗口的业务员),通过accept函数监听客户端的连接请求,如收到连接请求,则接受客户端的连接,并生成连接套接字用于通信使用。
ServerSocket的构造方法是ServerSocket(int port),port是一个端口号。port必须和客户呼叫的端口号相同。

try{    ServerSocket serverForClient = new ServerSocket(2010);
}
catch(IOException e){}

若实现客户端和服务器相互通信,一定涉及到IO流

缓冲流
BufferedReader类创建的对象称为缓冲输入。
BufferedReader流能够读取文本行,方法是readLine()。

下面用代码讲解

代码实现了客户端和服务器对发数据,并且客户端输入bye,客户端停止;客户端输入ok,服务器停止

//服务器程序
package Tcp;
import java.net.*;
import java.io.*;

public class TcpServer {
    public static void main(String[] args){
        try{
            //建立套接字
            ServerSocket server = new ServerSocket(4700);
            //监听
            Socket socket = server.accept();
            //建立连接
            InputStreamReader Sysin = new InputStreamReader(System.in);
            BufferedReader SysBuf = new BufferedReader(Sysin);

            InputStreamReader Socin = new InputStreamReader(socket.getInputStream());
            BufferedReader SocBuf = new BufferedReader(Socin);

            PrintWriter Socout = new PrintWriter(socket.getOutputStream());

            //通信
            System.out.println("Client:" + SocBuf.readLine());
            String readline = SysBuf.readLine();
            while(!readline.equals("bye")){
                Socout.println(readline);
                Socout.flush();
                System.out.println("Server:" + readline);

                String rl = SocBuf.readLine();
                if(!rl.equals("ok"))
                    System.out.println("Client:" + rl);
                else
                    break;

                readline = SysBuf.readLine();
            }
            //关闭IO、Socket
            Socout.close();
            Socin.close();
            server.close();
        }catch (Exception e){
            System.out.println("Error" + e);
        }
    }
}
//客户端程序
package Tcp;
import java.net.*;
import java.io.*;

public class TcpClient {
    public static void main(String[] args)throws Exception{
        try{
            //创建Socket
            Socket socket = new Socket("127.0.0.1",4700);

            //建立连接
            InputStreamReader Sysin = new InputStreamReader(System.in);
            BufferedReader SysBuf = new BufferedReader(Sysin);

            InputStreamReader Socin = new InputStreamReader(socket.getInputStream());
            BufferedReader SocBuf = new BufferedReader(Socin);

            PrintWriter Socout = new PrintWriter(socket.getOutputStream());

            //进行通信
            String readline = SysBuf.readLine();
            while(!readline.equals("bye")){
                Socout.println(readline);
                Socout.flush();
                System.out.println("Client:" + readline);

                System.out.println("Server:" + SocBuf.readLine());
                readline = SysBuf.readLine();
            }
            //关闭IO和Socket
            Socout.close();
            Socin.close();
            socket.close();
        }catch(Exception e){
            System.out.println("Error:" + e);
        }
    }
}