简单服务器开发(三)Socket 编程

Socket 的英文原义是“孔”或“插座”。通常也称作"套接字",用于描述 IP 地址和端口,可以用来实现不同计算机之间的通信。在 Internet 上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个 Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:
服务器监听,客户端请求,连接确认。
第一步:服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
第二步:客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。
为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
第三步:连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

JavaSE 中提供了实现 Socket 编程的 API,让网络编程变的更简单,更加面向对象。实现两台计算机(两个服务)之间的通讯,至少编写以下的代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServerSocket {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket clientSocket = null;
        BufferedReader br = null;
        try {
            //1.创建服务端套接字,表示创建一个服务,并绑定端口号8080
            serverSocket = new ServerSocket(8080);
            //2.开始监听网络,准备接收客户端消息,程序在此等待,客户端发送请求之后,接收客户端 套接
            clientSocket = serverSocket.accept();
            //3.接收客户端套接字消息
            br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String temp = null;
            //4.读取客户端消息
            while((temp = br.readLine()) != null){
                System.out.println(temp);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //5.关闭流,关闭客户端套接字,关闭服务端套接
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(clientSocket != null){
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(serverSocket != null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class MyClientSocket {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Socket clientSocket = null;
        PrintWriter out = null;
        try {
            //1. 创建客户端套接字,指向某台电脑的某台服务
            clientSocket = new Socket("localhost", 8080);
            //2.创建输入流对象
            out = new PrintWriter(clientSocket.getOutputStream());
            String msg = "Hello World!";
            //3.传送消息
            out.print(msg);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally{
            //关闭流,关闭客户端套接字
            if(out != null){
                out.close();
            }
            if(clientSocket != null){
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

读取的 从浏览器发送的 HTTP 请求协议

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MyServerSocket {

    /**
     * @param args
     */
    public static void main(String[] args) {
        ServerSocket serverSocket = null;
        Socket clientSocket = null;
        BufferedReader br = null;
        try {
            //1.创建服务端套接字,表示创建一个服务,并绑定端口号8080
            serverSocket = new ServerSocket(8080);
            //2.开始监听网络,准备接收客户端消息,程序在此等待,客户端发送请求之后,接收客户端 套接
            clientSocket = serverSocket.accept();
            System.out.println("clientSocket:" + clientSocket);//打印套接字
            //3.接收客户端套接字消息
            br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            String temp = null;
            //4.读取客户端消息
            while((temp = br.readLine()) != null){
                System.out.println(temp);
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //5.关闭流,关闭客户端套接字,关闭服务端套接
            if(br != null){
                try {
                    br.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(clientSocket != null){
                try {
                    clientSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            if(serverSocket != null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}

地址栏输入:

控制台输出:

原文地址:https://www.cnblogs.com/zhaideang/p/12297342.html

时间: 2024-10-17 01:22:36

简单服务器开发(三)Socket 编程的相关文章

Python服务器开发三:Socket

Python服务器开发三:Socket socket是操作系统中I/O的延续,它可以使进程和机器之间的通信成为可能.socket可以看成一个标准的文件描述符.不同的是文件需要用open()函数打开,而socket用socket() 函数建立.recv().send()函数和read().write()函数极为相似. TCP一般通过accept()来为每个连接的客户端建立一个新的scoket.UDP一般只是使用一个单一的socket,完全依靠recvfrom()返回的值来判断该往哪里发送响应. 客

【网络编程笔记】简单的TCP协议 socket编程(C语言版服务器和客户端)

下图是一般socket 编程图. 服务器的建立: 获取的本机名,用来解析得到本机的IP地址的:接着就绑定IP地址成功,然后服务器就处于监听状态,等待客户端的连接.也就是接下来就是TCP/IP的三次握手的操作,该操作成功了服务器和客户端就可以进行通信了.以下是注释代码: 1 void socketConnect() 2 { 3 char Server_name[128]; 4 WSADATA wsaData; 5 struct hostent *hp; 6 struct sockaddr_in a

简单理解php的socket编程

php的socket编程算是比较难以理解的东西吧,不过,我们只要理解socket几个函数之间的关系,以及它们所扮演的角色,那么理解起来应该不是很难了,在笔者看来,socket编程,其实就是建立一个网络服务的客户端和服务端,这和mysql的客户端和服务端是一样的,你只要理解mysql的客户端和服务端是怎么一回事,你就应该能够理解下面我要讲的东西吧. 关于socket编程所涉及到的网络协议,什么TCP啊,UDP啊,什么socket三次握手等等,这些网络协议网上有很详细的解释,这里不讲,只截个sock

linux服务器开发二(系统编程)--线程相关

线程概念 什么是线程 LWP:Light Weight Process,轻量级的进程,本质仍是进程(在Linux环境下). 进程:独立地址空间,拥有PCB. 线程:也有PCB,但没有独立的地址空间(共享). 进程与线程的区别:在于是否共享地址空间. 独居(进程). 合租(线程). Linux下: 线程:最小的执行单位. 进程:最小分配资源单位,可看成是一个线程的进程. 安装man文档 sudo apt-get install glibc-doc sudo apt-get install manp

Python开发——12.socket编程

一.OSI七层 1.物理层 物理层的主要功能是基于电气特性发送高低电压(高代表1,低代表0)形成电信号,使计算机完成组网以达到接入Internet的目的 2.数据链路层 数据链路层是用来定义电信号的分组方式,使单纯的电信号0和1变得有意义 (1)以太网协议 以太网协议(ethernet)是统一的分组标准,以太网协议规定:a.一组电信号构成一个数据包,叫做"帧":b.每一数据帧分成报头head和数据data两部分 报头(head)固定为18个字节,发送者即源地址.接受者即目标地址和数据类

简单服务器开发(四)结合XML部署服务器端口号

日期工具类: package com.zda.httpserver.util;import java.text.SimpleDateFormat; import java.util.Date; /** * 日期工具类 * @author zda * @version 1.0 * @since 1.0 * */ public class DateUtil { private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyy

简单服务器开发(五)多线程服务器

处理客户端请求: package com.zda.httpserver.core; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; import com.zda.httpserver.util.Logger; /** * 处理客户端请求 * @author zda * @version 1.0 * @since

Node简单服务器开发

运用的知识:http,fs,get,post 接口定义:/user?act=reg$user=aaa&pass=bbb后台返回格式:{"ok":false,"msg":"原因"}/user?act=login$user=aaa&pass=bbb后台返回格式:{"ok":true,"msg":"原因"} 前端访问:对文件的访问:http://localhost:8080/1

Windows Socket 编程_单个服务器对多个客户端简单通讯

单个服务器对多个客户端程序: 一.简要说明 二.查看效果 三.编写思路 四.程序源代码 五.存在问题 一.简要说明: 程序名为:TcpSocketOneServerToMulClient 程序功能:实现单个服务器对多个客户端通讯功能的小程序. PS: 这是继上次简单的 Tcp Windows Socket 编程后的再一程序,程序实现依然不是很严谨,还待完善~ 二.查看效果: 三.编写思路: 由上一次的程序思路来看,如果想实现单个服务器对多个客户端程序的通讯的话,这次程序编写尝试从多线程的角度来考