Java网络socket编程详解
或许有点长
但是一步步教你
女生网名 伤感我想你也愿意看
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 开发客户端代码
9月你好的图片
根据上面描述的通讯流程,我们可以按如下的步骤设计服务器端的代码。
    第一步,依次点击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.ServerSocket;
import java.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 OutputStream())), 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对象。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。