没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
或许有点长
但是一步步教你
我想你也愿意看
7.2 面向套接字编程
我们已经通过了解 Socket 的接口,知其所以然,下面我们就将通过具体的案例,来熟悉
Socket 的具体工作方式
7.2.1 使用套接字实现基于 TCP 协议的服务器和客户机程序
依据 TCP 协议,在 C/S 架构的通讯过程中,客户端和服务器的 Socket 动作如下:
客户端:
1.用服务器的 IP 地址和端口号实例化 Socket 对象。
2.调用 connect 方法,连接到服务器上。
3.将发送到服务器的 IO 流填充到 IO 对象里,比如 BufferedReader/PrintWriter。
4.利用 Socket 提供的 getInputStream 和 getOutputStream 方法,通过 IO 流对象,向服务器发
送数据流。
5. 通讯完成后,关闭打开的 IO 对象和 Socket。
服务器:
1. 在服务器,用一个端口来实例化一个 ServerSocket 对象。此时,服务器就可以这个端口
时刻监听从客户端发来的连接请求。
2.调用 ServerSocket 的 accept 方法,开始监听连接从端口上发来的连接请求。
3.利用 accept 方法返回的客户端的 Socket 对象,进行读写 IO 的操作
通讯完成后,关闭打开的流和 Socket 对象。
7.2.1.1 开发客户端代码
根据上面描述的通讯流程,我们可以按如下的步骤设计服务器端的代码。
第一步,依次点击 Eclipse 环境里的“文件”|“新建”|“项目”选项,进入“新建项目”的向导对
话框,在其中选中“Java 项目”,点击“下一步”按钮,在随后弹出的对话框里,在其中的“项
目名”一栏里,输入项目名“TCPSocket”,其它的选项目
选择系统默认值,再按“完成”按钮,结束创建 Java 项目的动作。
第二步,完成创建项目后,选中集成开发环境左侧的项目名“TCPSocket”,点击右键,在
随后弹出的菜单里依次选择“新建”!“类”的选项,创建服务器类的代码。
在随后弹出的“新建 Java 类”的对话框里,输入包名“tcp”,输入文件名“ServerCode”,请注意
大小写,在“修饰符”里选中“公用”,在“想要创建哪些方法存根”下,选中“ public static void
main(String[] args )”单选框,同时把其它两项目取消掉,再按“完成”按钮,可以生成代码。
第三步,在生成的代码里,编写引入 Java 包的代码,只有当我们引入这些包后,我们才
能调用这些包里提供的 IO 和 Socket 类的方法。
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.ServerSocket;
import java.net.Socket;
第四步,编写服务器端的主体代码,如下所示。
public class ServerCode
{
// 设置端口号
public static int portNo = 3333;
public static void main(String[] args) throws IOException
{
ServerSocket s = new ServerSocket(portNo);
System.out.println("The Server is start: " + s);
// 阻塞,直到有客户端连接
Socket socket = s.accept();
try
{
System.out.println("Accept the Client: " + socket);
//设置 IO 句柄
BufferedReader in = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())), true);
while (true)
{
String str = in.readLine();
if (str.equals("byebye"))
{
break;
}
System.out.println("In Server reveived the info: " + str);
out.println(str);
}
}
finally
{
System.out.println("close the Server socket and the io.");
socket.close();
s.close();
}
}
}
这段代码的主要业务逻辑是:
1. 在上述代码里的 main 函数前,我们设置了通讯所用到的端口号,为 3333。
2. 在 main 函数里,根据给定 3333 端口号,初始化一个 ServerSocket 对象 s,该对象用
来承担服务器端监听连接和提供通讯服务的功能。
3. 调用 ServerSocket 对象的 accept 方法,监听从客户端的连接请求。当完成调用 accept
方法后,整段服务器端代码将回阻塞在这里,直到客户端发来 connect 请求。
4. 当客户端发来 connect 请求,或是通过构造函数直接把客户端的 Socket 对象连接到
服务器端后,阻塞于此的代码将会继续运行。此时服务器端将会根据 accept 方法的执行结
果,用一个 Socket 对象来描述客户端的连接句柄。
5. 创建两个名为 in 和 out 的对象,用来传输和接收通讯时的数据流。
6. 创建一个 while(true)的死循环,在这个循环里,通过 in.readLine()方法,读取从客户
端发送来的 IO 流(字符串),并打印出来。如果读到的字符串是“ byebye”,那么退出
while 循环。
7. 在 try…catch…finally 语句段里,不论在 try 语句段里是否发生异常,并且不论这些
异常的种类,finally 从句都将会被执行到。在 finally 从句里,将关闭描述客户端的连接句
柄 socket 对象和 ServerSocket 类型的 s 对象。
7.2.1.2 开发客户端代码
我们可以按以下的步骤,开发客户端的代码。
第一,在 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);
剩余29页未读,继续阅读
资源评论
- tuliao20112013-09-11这个socket通信代码写得很全面,很有用,如果能加点注释就更好了
ak_ajin
- 粉丝: 1
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功