Java Socket 知识总结

1.什么是Socket

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

2.Socket原理

所谓套接字,实际上是一个通信端点,每个套接字都有一个套接字序号,包括主机的IP地址与一个16位的主机端口号,即形如(主机IP地址:端口号)。例如,如果IP地址是210.37.145.1,而端口号是23,那么得到套接字就是(210.37.145.1:23)。
套接字可以看成是两个网络应用程序进行通信时,各自通信连接中的一个端点。通信时,其中的一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过网络接口卡的传输介质将这段信息发送给另一台主机的Socket中,使这段信息能传送到其他程序中。因此,两个应用程序之间的数据传输要通过套接字来完成。
在网络应用程序设计时,由于TCP/IP的核心内容被封装在操作系统中,如果应用程序要使用TCP/IP,可以通过系统提供的TCP/IP的编程接口来实现。在Java环境下,网络应用程序编程接口称作Java Socket。为了支持用户开发面向应用的通信程序,大部分系统都提供了一组基于TCP或者UDP的应用程序编程接口(API),该接口通常以一组函数的形式出现,也称为套接字(Socket)。

3.Socket 调用流程

在这里插入图片描述
socket():创建套接字。

bind():指定本地地址。一个套接字用socket()创建后,它其实还没有与任何特定的本地或目的地址相关联。在很多情况下,应用程序并不关心它们使用的本地地址,这时就可以不用调用bind指定本地的地址,而由协议软件为它们选择一个。但是,在某个知名端口(Well-known Port)上操作的服务器进程必须要对系统指定本地端口。所以一旦创建了一个套接字,服务器就必须使用bind()系统调用为套接字建立一个本地地址。

connect():将套接字连接到目的地址。初始创建的套接字并未与任何外地目的地址关联。客户机可以调用connect()为套接字绑定一个永久的目的地址,将它置于已连接状态。对数据流方式的套接字,必须在传输数据前,调用connect()构造一个与目的地的TCP连接,并在不能构造连接时返回一个差错代码。如果是数据报方式,则不是必须在传输数据前调用connect。如果调用了connect(),也并不像数据流方式那样发送请求建连的报文,而是只在本地存储目的地址,以后该socket上发送的所有数据都送往这个地址,程序员就可以免去为每一次发送数据都指定目的地址的麻烦。

listen():设置等待连接状态。对于一个服务器的程序,当申请到套接字,并调用bind()与本地地址绑定后,就应该等待某个客户机的程序来要求连接。listen()就是把一个套接字设置为这种状态的函数。

accept():接受连接请求。服务器进程使用系统调用socket,bind和listen创建一个套接字,将它绑定到知名的端口,并指定连接请求的队列长度。然后,服务器调用accept进入等待状态,直到到达一个连接请求。
send()/recv()和sendto()/recvfrom():发送和接收数据 。在数据流方式中,一个连接建立以后,或者在数据报方式下,调用了connect()进行了套接字与目的地址的绑定后,就可以调用send()和reev()函数进行数据传输。

closesocket():关闭套接字。

简单例子

创建服务端

public void startServer(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                // 创建服务端socket
                ServerSocket serverSocket = new ServerSocket(9999);

                // 创建客户端socket
                Socket socket = new Socket();

                //循环监听等待客户端的连接
                while(true){
                    // 监听客户端
                    socket = serverSocket.accept();

                    ServerThread thread = new ServerThread(socket);
                    thread.start();

                    InetAddress address=socket.getInetAddress();
                    System.out.println("当前客户端的IP:"+address.getHostAddress());
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }).start();
}

创建客户端

public void startClient(View view) {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                // 和服务器创建连接
                Socket socket = new Socket("localhost",9999);

                // 要发送给服务器的信息
                OutputStream os = socket.getOutputStream();
                PrintWriter pw = new PrintWriter(os);
                pw.write("客户端发送信息");
                pw.flush();

                socket.shutdownOutput();

                // 从服务器接收的信息
                InputStream is = socket.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                String info = null;
                while((info = br.readLine())!=null){
                    System.out.println("我是客户端,服务器返回信息:"+info);
                }

                br.close();
                is.close();
                os.close();
                pw.close();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

}

在这里插入图片描述
参考资料
百度文库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在开发五子棋的小程序时,主要涉及以下几个Java知识点: 1. 面向对象的思想:通过创建一个名为Chess的类,将棋子对象化,使用该类的对象来表示棋子的行、列和标识。这样可以更方便地进行悔棋操作和棋盘的重绘。 2. 使用数组和二维数组:通过使用数组和二维数组来表示棋盘和棋子的状态。可以根据棋子对象所在的行、列信息,在二维数组中设置对应位置的值来表示棋子的存在。同时,可以根据数组中的值来判断游戏的胜负。 3. 事件监听器(Listener):使用GoListener类来监听玩家的操作,如鼠标点击棋盘的位置来下棋。该类中的相关方法负责处理玩家的操作,并更新棋盘和棋子的状态。例如,实现悔棋功能时,根据棋盘上的棋子顺序数组,删除最后一颗棋子,并在棋盘和棋子数组中相应位置进行更新。 4. 图形界面的绘制:通过使用Java的图形库,可以实现五子棋的可视化界面。绘制棋盘和棋子的图形,并随着玩家的操作进行更新。 5. 网络编程:在开发五子棋游戏大厅时,可能还涉及到Socket编程的相关知识点。这可以用来实现游戏大厅的功能,如动态加载游戏,让玩家选择进入游戏等。 总结来说,五子棋的Java知识点重点包括面向对象的思想、数组和二维数组的使用、事件监听器、图形界面的绘制以及可能的网络编程。这些知识点是开发五子棋小程序的关键所在。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值