今天看了一下《计算机网络:自顶向下方法》,也就是计算机网络的教材的应用层一章,决定实现以下后面的Java C/S应用程序的例子,用来演示TCP和UDP套接字编程。
程序流程如下:
1.一台客户机从其标准输入(键盘)读入一行字符,并通过其套接字将该行发送到服务器。
2.服务器从其连接套接字读取一行字符。
3.服务器将该行字符转换成大写。
4.服务器将修改后的字符串(行)通过连接套接字再发回给客户机。
5.客户机从其套接字中读取修改后的行,然后将该行在其标准输出(监视器)上打印出来。
下面是应用程序客户机端的代码:
TCPClient.java
import java.io.*;
import java.net.*;
class TCPClient {
public static void main(String[] argc) throws Exception
{
String sentence,modifiedsentence; //定义两个字符串,一个是标准输入的,另一个是服务器返回的已经处理的
BufferedReader inFromUser =
new BufferedReader(new InputStreamReader(System.in)); //创建BufferedReader流对象来接受键盘输入
Socket clientSocket =
new Socket("hostname",6789); //创建类型为Socket的clientSocket对象,发起客户机与服务器之间的TCP连接(hostname填服务器主机名,如果用本机做服务器,则填本机名,hostname(主机名)可以在网络或我的电脑中查看
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream()); //创建连接到套接字的流对象,提供了到套接字的输出
BufferedReader inFromServer =
new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //创建连接到套接字的流对象,提供了来自套接字的输入
sentence = inFromUser.readLine(); //读入键盘输入的字符串
outToServer.writeBytes(sentence + '
'); //加上换行符发送到outToServer流中
modifiedsentence = inFromServer.readLine(); //接受返回的字符串
System.out.println("FROM SERVER: " + modifiedsentence); //打印结果
clientSocket.close(); //关闭TCP连接
}
}
下面看一下服务器端的程序:
TCPServer.java
import java.io.*;
import java.net.*;
class TCPServer {
public static void main(String[] argc) throws Exception
{
String clientSentence,capedSentence;
ServerSocket welcomeSocket =
new ServerSocket(6789); //创建一个类型为ServerSocket的welcomeSocket对象,在6789端口上监听客户机的“敲门声”
while(true) //持续监听
{
Socket connectionSocket =
welcomeSocket.accept(); //当客户机“敲门”时,创建一个连接套接字connectionSocket,使用6789号端口,TCP此时在客户端和服务器间建立了一条虚拟管道,双方可以通过这条管道传输数据(字节)
BufferedReader inFromClient =
new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); //创建流对象接受客户机发来的字符串
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream()); //创建要发回给客户机的流对象
clientSentence = inFromClient.readLine(); //读取客户机发来的信息
capedSentence = clientSentence.toUpperCase() + '
'; //将其变为大写,加上回车符
outToClient.writeBytes(capedSentence); //发回给客户机
}
}
}
运行结果: