开发客户端的代码
第一,在TCPSocket项目下的tcp包下,创建一个名为ClientCode.java的文件。在其中编写引入Java包的代码,如下所示:
package tcp;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
第二,编写客户端的主体代码,如下所示:
public class ClientCode
{
static String clientName = "Mike";
//端口号
public static int portNo = 3333;
public static void main(String[] args) throws IOException
{
// 设置连接地址类,连接本地
InetAddress addr = InetAddress.getByName("localhost");
//要对应服务器端的3333端口号
Socket socket = new Socket(addr, portNo);
try
{
System.out.println("socket = " + socket);
// 设置IO句柄
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
PrintWrite out = new PrintWriter(BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
out.println("Hello Server,I am " + clientName);
String str = in.readLine();
System.out.println(str);
out.println("byebye");
}
finally
{
System.out.println("close the Client socket and the io.");
socket.close();
}
}
}
上述客户端代码的主要业务逻辑是:
1. 同样定义了通讯端口号,这里给出的端口号必须要和服务器端的一致。
2. 在main函数里,根据地址信息“localhost”,创建一个InetAddress类型的对象addr。这里,因为我们把客户端和服务器端的代码都放在本机运行,所以同样可以用“127.0.0.1”字符串,来创建InetAddress对象。
3. 根据addr和端口号信息,创建一个Socket类型对象,该对象用来同服务器端的ServerSocket类型对象交互,共同完成C/S通讯流程。
4. 同样地创建in和out两类IO句柄,用来向服务器端发送和接收数据流。
5. 通过out对象,向服务器端发送"Hello Server,I am …"的字符串。发送后,同样可以用in句柄,接收从服务器端的消息。
6. 利用out对象,发送”byebye”字符串,用以告之服务器端,本次通讯结束。
7. 在finally从句里,关闭Socket对象,断开同服务器端的连接。
运行效果演示
在上述两部分里,我们分别讲述了C/S通讯过程中服务器端和客户端代码的业务逻辑,下面我们将在集成开发环境里,演示这里通讯流程。
第一步,选中ServerCode.java代码,在eclipse的“运行”菜单里,选中“运行方式”|“1 Java应用程序”的菜单,开启服务器端的程序。
开启服务端程序后,会在eclipse环境下方的控制台里显示如下的内容:
The Server is start: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=3333]
在这里,由于ServerSocket对象并没监听到客户端的请求,所以addr和后面的port值都是初始值。
第二步,按同样的方法,打开ClientCode.java程序,启动客户端。启动以后,将在客户端的控制台里看到如下的信息:
socket = Socket[addr=localhost/127.0.0.1,port=3333,localport=1326]
Hello Server,I am Mike
close the Client socket and the io.
从中可以看到,在第一行里,显示客户端Socket对象连接的IP地址和端口号,在第二行里,可以到到客户端向服务器端发送的字符串,而在第三行里,可以看到通讯结束后,客户端关闭连接Socket和IO对象的提示语句。
第三步,在eclipse下方的控制台里,切换到ServerCode服务端的控制台提示信息里,我们可以看到服务器端在接收到客户端连接请求后的响应信息。
响应的信息如下所示:
The Server is start: ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=3333]
Accept the Client: Socket[addr=/127.0.0.1,port=1327,localport=3333]
In Server reveived the info: Hello Server,I am Mike
close the Server socket and the io.
其中,第一行是启动服务器程序后显示的信息。在第二行里,显示从客户端发送的连接请求的各项参数。在第三行里,显示了从客户端发送过来的字符串。在第四行里,显示了关闭服务器端ServerSocket和IO对象的提示信息。从中我们可以看出在服务器端里accept阻塞和继续运行的这个过程。
通过上述的操作,我们可以详细地观察到C/S通讯的全部流程,请大家务必要注意:一定要先开启服务器端的程序再开启客户端,如果这个步骤做反的话,客户端程序会应找不到服务器端而报异常。