套接字 Socket 和 ServerSocket 讲解和实例

什么是Socket?

网络上两个程序通过一个双向的通信链接实现数据的交换,这个链接的一端称为一个Socket

建立网络连接至少需要一对端口号。

Socket 套接字是网络连接的一个端点,套接字使一个应用可以从网络中读取和写入数据,放到不同的计算机上,可以使两个应用通过连接发送和接收字节流,为了让一个应用发送数据到另一个应用,你需要知道另一个应用的IP地址和接口(其实是服务端的域名和接口)

public Socket (java.lang.String host, int port)

一旦建立成功,你就可以用它接收和发送字节流。要发送时你需要用到Socket类中的getOutputStream方法来获取一个java.io.OutputStream对象。要送出字节流,你需要从返回的OutputStream对象中构造一个java.io.PrintWriter对象。

同时你要接收字节流可以调用Socket类中的getInputStream方法来返回一个java.io.InputStream对象。

ServerSocket 服务端套接字,由于服务端和客户端不一样要随时待命,所以就用到java.net.ServerSocket类。一旦获得一个连接的请求,就会创建一个Socket来和客户端进行通信。

它有4个构造方法, port是端口, backlog是能承受的连接数,服务端的IP,默认是127.0.0.1(本机的IP)

public ServerSocket() ,
public ServerSocket(int port),
public ServerSocket(int port, int backlog),
public ServerSocket(int port, int backlog, InetAddress bindAddr)

一个小的Demo客户端:
import java.io.*;import java.net.Socket;

public class Client {    public static void main(String[] args){        while(true){            try{                Socket s = new Socket("10.10.10.124",8088);                OutputStream o = s.getOutputStream();                PrintWriter pw = new PrintWriter(o);                System.out.print("请输入: \t");                String str = new BufferedReader(new InputStreamReader(System.in)).readLine();                pw.write(str);                pw.flush();                s.shutdownOutput();//关闭输出流,这个并不是关闭了连接,而是关闭了流,目的为了防止在一个流中出现输入、输出交叉影响会先设置好输出输入的先后顺序,然后在写入客户端或者服务端的时候,要将优先使用过的输入输出流进行暂时性关闭,保证输入输出流的数据流畅和准确性!                InputStream is=s.getInputStream();                BufferedReader br=new BufferedReader(new InputStreamReader(is));                String info= br.readLine();                if ("OK".equals(info)) {                    System.out.println("客户端将关闭连接");                    Thread.sleep(500);                    break;                }                System.out.println("我是客户端,服务器说:"+info);                br.close();                is.close();                pw.close();                o.close();                s.close();            }catch (Exception e){                e.printStackTrace();            }        }    }}客户端结果:

请输入: 你好
我是客户端,服务器说:你好
请输入: 我是客户端
我是客户端,服务器说:我是服务端
请输入: 见到你很高兴
我是客户端,服务器说:我也是,见到你很高兴
请输入: 测试就到这里吧
客户端将关闭连接

服务端
import com.sdy.im.socket.ServerThread;

import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;

public class Server {    public static void main(String[] args) {        try {            ServerSocket ss = new ServerSocket(8088);            Socket s = null;            int count = 0;            System.out.println("***服务器即将启动,等待客户端的连接***");            while (true) {                s = ss.accept();                ServerThread st = new ServerThread(s);                st.start();                count++;                System.out.println("客户端的数量:" + count);                InetAddress address = s.getInetAddress();                System.out.println("当前客户端的IP:" + address.getHostAddress());            }        } catch (Exception e) {            e.printStackTrace();        }    }}
import java.io.*;import java.net.Socket;

public class ServerThread extends Thread{    Socket socket = null;    public ServerThread(Socket socket) {        this.socket = socket;    }    public void run() {        InputStream is = null;        InputStreamReader isr = null;        BufferedReader br = null;        OutputStream os = null;        PrintWriter pw = null;        try {            is = socket.getInputStream();            isr = new InputStreamReader(is);            br = new BufferedReader(isr);            String info = null;            while ((info = br.readLine()) != null) {//循环读取客户端的信息                System.out.println("我是服务器,客户端说:" + info);            }            socket.shutdownInput();//关闭输入流            os = socket.getOutputStream();            System.out.print("请输入:\t");            // 发送键盘输入的一行            String s = new BufferedReader(new InputStreamReader(System.in)).readLine();            pw = new PrintWriter(os);            pw.write(s);            pw.flush();//调用flush()方法将缓冲输出        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (pw != null) {                    pw.close();                }                if (os != null) {                    os.close();                }                if (br != null) {                    br.close();                }                if (isr != null) {                    isr.close();                }                if (is != null) {                    is.close();                }            } catch (Exception e) {                e.printStackTrace();            }        }    }}

服务端结果:

我是服务器,客户端说:你好
请输入: 你好
客户端的数量:14
当前客户端的IP:10.10.10.124
我是服务器,客户端说:我是客户端
请输入: 我是服务端
客户端的数量:15
当前客户端的IP:10.10.10.124
我是服务器,客户端说:见到你很高兴
请输入: 我也是,见到你很高兴
客户端的数量:16
当前客户端的IP:10.10.10.124
我是服务器,客户端说:测试就到这里吧
请输入: OK

参考: https://www.cnblogs.com/baxianhua/p/9287836.html

https://blog.csdn.net/qq_41517936/article/details/81015711

原文地址:https://www.cnblogs.com/echo777/p/11793916.html

时间: 2024-10-11 02:00:12

套接字 Socket 和 ServerSocket 讲解和实例的相关文章

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

专题七.网络编程之套接字Socket、TCP和UDP通信实例

https://blog.csdn.net/Eastmount/article/details/48909861 找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. https://www.cnblogs.com/alex3714/articles/5227251.html 1.Socket语法及相关 2.SocketSer

什么是套接字(Socket)?套接字(Socket)是什么意思?(转)

应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字(Socket)的接口,区分不同应用程序进程间的网络通信和连接. 网络化的应用程序在开始任何通讯之前都必需要创建套接字.就像电话的插口一样,没有它就完全没办法通信. 生成套接字,主要有3个参数:通信的目的IP地址.使用的传输层协议(

Linux进程间通信 -- 数据报套接字 socket()、bind()、sendto()、recvfrom()、close()

前一篇文章,Linux进程间通信——使用流套接字介绍了一些有关socket(套接字)的一些基本内容,并讲解了流套接字的使用,这篇文章将会给大家讲讲,数据报套接字的使用. 一.简单回顾——什么是数据报套接字 socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行.也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信.也因为这样,套接字明确地将客户端和服务器区分开来. 相对于流套接字,数据报套接字的

什么是套接字(Socket)

应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题.多个TCP连接或多个应用程序进程可能需要 通过同一个TCP协议端口传输数据.为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接. 生成套接字,主要有3个参数:通信的目的IP地址.使用的传输 层协议(TCP或UDP)和使用的端口号.Socket原意是“插座”.通过将这3个参数结合起来,与一个“

套接字—Socket

网络编程就不得不提大名鼎鼎的套接字-Socket 一,什么是Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个Socket.Socket的英文原意是"插座",通常称之为套接字,来描述IP地址和端口,是一个通信链的句柄,用来实现不同虚拟机或者计算机之间的通信. 在Internet上的主机一般运行了多个服务软件,同时提供几种服务.每种服务都打开一个Socket,并绑定到一个端口上,与不同客户端的不同服务对应着不同的Socket,这样实现了与多个服务器

Java知多少(105)套接字(Socket)

网络应用模式主要有: 主机/终端模式:集中计算,集中管理: 客户机/服务器(Client/Server,简称C/S)模式:分布计算,分布管理: 浏览器/服务器模式:利用Internet跨平台. www(万维网)就是建立在客户机/服务器模式上,以HTML语言和HTTP协议为基础,能够提供各种Internet服务的信息浏览系统.网络信息放在主机的不同位置,www服务器利用超文本链路链接各项信息.www客户机(浏览器Brower)负责与服务器建立联系,向服务器发送请求,处理HTML超媒体,提供图形用户

Java套接字Socket

这篇博客是本人学习<Java网络程序设计>书中第4章套接字的学习总结.初学者网友学习这篇Java套接字文章,如果难于理解文章前面理论部分,可以先运行后面的程序,边看运行后面的程序边理解前面的原理,这对初学者是最好的方法.所有源代码都在文章后面我的github链接代码中. --惠州学院 13网络工程 吴成兵 20160607 目录 1 目录 1 一 流套接字概述 二 服务器套接字ServerSocket 21 ServerSocket的工程过程 22 ServerSocket构造方法 23 Se

网络---中断套接字Socket

1 package socketpack_2; 2 import java.awt.BorderLayout; 3 import java.awt.EventQueue; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.io.PrintWrit