继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Socket理解

Caeser110
关注TA
已关注
手记 139
粉丝 31
获赞 154

Socket 中文翻译是 “插座”
通过这个翻译就很容易理解,就是提供了插口,你的工具插入插座,并且可以和插座进行交互建立联系,即可让你的工具开始工作。
于是不得不提TCP和UDP了。

TCP

Transmission Control Protocol
传输控制协议
TCP是实时的,如果访问某地址是有响应的,而且响应符合格式要求,那么就会接收该响应,完成返回。

UDP

用户数据报协议
UDP不是实时的,数据包发给指定地址,但不会等对方是否响应,会继续发包,如果你之前断开了连接,那么之前的数据包你无法再次请求。主要用于直播和C/S模式的在线游戏等。
TCP很像打电话,UDP很像发短信。
引用一张stackoverflow上的图片:
在这里插入图片描述
这是计算机网络必学的内容,我们或许在学习的时候没有特别在意,但是这很基础,也很重要。
大多数操作系统都提供能与网络通信的API,使用TCP可以使用Socket按照HTTP规范进行消息编码,完成通信,大部分编程语言都做了很好的封装来帮助我实现该功能。
Java 实现

import java.io.*;
import java.net.*;
public class smtpClient {
    public static void main(String[] args) {
// declaration section:
// smtpClient: our client socket
// os: output stream
// is: input stream
        Socket smtpSocket = null;  
        DataOutputStream os = null;
        DataInputStream is = null;
// Initialization section:
// Try to open a socket on port 25
// Try to open input and output streams
        try {
            smtpSocket = new Socket("hostname", 25);
            os = new DataOutputStream(smtpSocket.getOutputStream());
            is = new DataInputStream(smtpSocket.getInputStream());
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: hostname");
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: hostname");
        }
// If everything has been initialized then we want to write some data
// to the socket we have opened a connection to on port 25
    if (smtpSocket != null && os != null && is != null) {
            try {
// The capital string before each colon has a special meaning to SMTP
// you may want to read the SMTP specification, RFC1822/3
        os.writeBytes("HELO\n");    
                os.writeBytes("MAIL From: k3is@fundy.csd.unbsj.ca\n");
                os.writeBytes("RCPT To: k3is@fundy.csd.unbsj.ca\n");
                os.writeBytes("DATA\n");
                os.writeBytes("From: k3is@fundy.csd.unbsj.ca\n");
                os.writeBytes("Subject: testing\n");
                os.writeBytes("Hi there\n"); // message body
                os.writeBytes("\n.\n");
        os.writeBytes("QUIT");
// keep on reading from/to the socket till we receive the "Ok" from SMTP,
// once we received that then we want to break.
                String responseLine;
                while ((responseLine = is.readLine()) != null) {
                    System.out.println("Server: " + responseLine);
                    if (responseLine.indexOf("Ok") != -1) {
                      break;
                    }
                }
// clean up:
// close the output stream
// close the input stream
// close the socket
        os.close();
                is.close();
                smtpSocket.close();   
            } catch (UnknownHostException e) {
                System.err.println("Trying to connect to unknown host: " + e);
            } catch (IOException e) {
                System.err.println("IOException:  " + e);
            }
        }
    }           
}

主要实现步骤就是
(1)创建一个socket
(2)给socket创建一个输入和输出流
(3)根据服务协议读取信息
(4)清除,收尾工作
具体的应用示例,可以参考我的 《Java局域网象棋》

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP

相关阅读

Java异常处理详解