网络通信
首先说网络通信,网络通信使用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);
}
}
}