socket
- “套接字”
- Socket是建立在传输层协议(主要是TCP和UDP)上的一种套接字规范,最初是由美国加州Berkley大学提出
- 一种进程通信机制
- 用于描述IP地址和端口,是一个通信链的句柄
- 端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口)
- Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。
java socket
- Socket和ServerSocket类库位于java.net包中。
- ServerSocket用于服务器端,Socket是建立网络连接时使用的。
- Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。
- getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。
- getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。
- 注意:其中getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
- server
import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { // 创建server socket ServerSocket server = new ServerSocket(5678); while (true) { // 服务器接收到客户端的数据后,创建与此客户端对话的Socket Socket client = server.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); PrintWriter out = new PrintWriter(client.getOutputStream()); while (true) { String str = in.readLine(); System.out.println(str); out.println("has receive:" + str); out.flush(); if (str.equals("end")) break; } client.close();// 不需要继续使用此连接时,关闭连接 } } }
- client
import java.net.*; import java.io.*; public class Client { static Socket server; public static void main(String[] args) throws Exception { server = new Socket(InetAddress.getLocalHost(), 5678); BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream())); PrintWriter out = new PrintWriter(server.getOutputStream()); BufferedReader wt = new BufferedReader(new InputStreamReader(System.in)); while (true){ String str = wt.readLine(); out.println(str); out.flush(); if (str.equals("end")){ break; } System.out.println(in.readLine()); } server.close(); } }
delphi socket
- stNonBlocking表示异步读写信息。
- client
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ScktComp; type TForm1 = class(TForm) edt_send: TEdit; btn_send: TButton; btn_connect: TButton; edt_host: TEdit; edt_port: TEdit; edt_receive: TEdit; lbl1: TLabel; lbl2: TLabel; lbl3: TLabel; lbl4: TLabel; procedure btn_sendClick(Sender: TObject); procedure btn_connectClick(Sender: TObject); procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); private public end; var Form1: TForm1; ClientSocket: TClientSocket; implementation {$R *.dfm} procedure TForm1.btn_sendClick(Sender: TObject); begin ClientSocket.Socket.SendText(edt_send.Text+#13); end; procedure TForm1.btn_connectClick(Sender: TObject); begin ClientSocket.Close; ClientSocket.Host := edt_host.Text; ClientSocket.Port := StrToInt(edt_port.Text); ClientSocket.Open; // 指定处理事件 ClientSocket.OnRead := ClientSocketRead; end; procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin edt_receive.Text := Socket.ReceiveText; end; //****************************************************************************** //****************************************初始化,清理************************** //****************************************************************************** initialization ClientSocket := TClientSocket.Create(nil); // ClientSocket.ClientType := ctNonBlocking; finalization ClientSocket.Free; end.