socket怎么连接服务器(websocket连接socket服务器)

      最后更新:2024-03-29 09:40:55 手机定位技术交流文章

      如何建立"socket"连接?

      一般socket链接有以下两种方式:长(常)链接和短链接。 长链接:当数据发送完成后socket链接不断开。一直保留到异常或者是程序退出为止 ,这种方式的好处是不用每次去发起连接断开,在速度上可以比短连接要快一些,但是相 对来说对服务器的资源压力也要大些。长链接用的范围很广,比如游戏系统,qq等等,长 (常)链接一般还需要定时向服务器ping数据,以保证socket链接畅通。当ping不通服务 器时,需要重新开启链接。短链接:当一次数据发送完毕后,主动断开链接,每次发送数据都要一次链接、断开 操作,这种方式的好处是:对服务器的资源占用相对来说比较小,但是由于每次都要重新 链接,速度开销上也比较大,这种方式对于那种不需要经常与服务器交互的情况下比较适 用。上面两种方法在用户量非常大的情况下都存在着很大的不足,因此,考虑可以用 一种折衷的办法,那就是使用socket的连接池。程序一开始初始化创建若干数量的长链接。给他们设置一个标识位,这个标识位表示 该链接是否空闲的状态。当需要发送数据的时候,系统给它分配一个当前空闲的链接。同 时,将得到的链接设置为“忙”,当数据发送完毕后,把链接标识位设置为 “闲”,让系统可以分配给下个用户,这样使得两种方式的优点都充分的发挥 出来了。用户数量足够多的时候,只需要动态增加链接池的数量即可。下面我们用具体的程序来讲解下:首先声明一个socket类:public class XieGouSocket{public Socket m_socket; //Socket对象public bool m_isFree; //判断是否空闲public int m_index; //在链接缓存池中的索引值}下面的函数是创建socket链接池,这里为了使代码更加清晰,特地把异常处理部分 全部取掉了。public XieGouSocket[] m_socket; //先定义个缓冲池public void CreateSocketPool(){string ip= “127.0.0.1”;string port= 2003;IPAddress serverIp=IPAddress.Parse(ip);int serverPort=Convert.ToInt32(port);IPEndPoint iep=new IPEndPoint(serverIp,serverPort);m_socket = new XieGouSocket[200];for(int i =0; i < 200 ; i ++){m_socket[i] = new XieGouSocket();m_socket[i].m_index = i ;m_socket[i].m_isFree = true;m_socket[i].m_socket =new Socket (AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);m_socket[i].m_socket.SetSocketOption (SocketOptionLevel.Socket,SocketOptionName.SendTimeout,1000);m_socket[i].m_socket.Connect(iep);}}下面的函数是获取当前空闲的socket链接:因为是多线程,所以需要加一个原子操作,定义一个原子变量,以防止多个线程 之间抢占资源问题的发生。private static Mutex m_mutex=new Mutex();public static XieGouSocket GetFreeConnection(){m_mutex.WaitOne(); //先阻塞for(int i =0; i < m_socket.Length ; i ++){if(m_socket[i].m_isFree) //如果找到一个空闲的{m_socket[i].m_isFree = false;m_mutex.ReleaseMutex();//释放资源return m_socket[i];}}//如果没有空闲的链接,要么等待,要么程序再动态创建一个链接。m_mutex.ReleaseMutex();//释放资源return null;} 当数据发送完毕后,程序必须将m_isFree 设置为 False。否则只使用不释放,程序很 快就溢出了。
      如何建立

      如何在客户端上建立一个Socket与服务器端连接,包括连接的函数?

      在服务器端设置一个标志变量,如int flag = 0,当有客户端连接上了,就检查那个标志变量是否为0,如果是的话就连接,然后将这个标志设为1。如果为1的话就拒绝连接。我不知道你是用什么语言编写的,所以具体怎么去拒绝连接就自己多想想吧··· 在java里面很容易实现,下面是我在java中实现的服务器端代码,希望对你有帮助。。。package ob;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server {Socket socket;boolean flag = true;public void createServer() {try {ServerSocket serverSocket = new ServerSocket(9090);while (true) {socket = serverSocket.accept();if (flag) {System.out.println("有用户连上···");System.out.println("ip:"+socket.getRemoteSocketAddress().toString()+" port:"+socket.getPort());flag = false;}else{System.out.println("有用户连上···");socket.close();System.out.println("关闭用户连接···");}}} catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) {new Server().createServer();}}
      如何在客户端上建立一个Socket与服务器端连接,包括连接的函数?

      如何在客户端上建立一个Socket与服务器端连接,包括连接的函数?

      进入mysql,创建一个新用户xuys: 格式:grant 权限 on 数据库名.表名 用户@登录主机 identified by "用户密码";grant select,update,insert,delete on *.* to xuys@192.168.88.234 identified by "xuys1234";查看结果,执行:use mysql;select host,user,password from user;可以看到在user表中已有刚才创建的xuys用户。host字段表示登录的主机,其值可以用IP,也可用主机名,将host字段的值改为%就表示在任何客户端机器上能以xuys用户登录到mysql服务器,建议在开发时设为%。update user set host = '%' where user = 'xuys';2、 ./mysqladmin -uroot -p21century reload./mysqladmin -uroot -p21century shutdown3、./mysqld_safe --user-root &记住:对授权表的任何修改都需要重新reload,即执行第3步。如果经过以上3个步骤还是无法从客户端连接,请执行以下操作,在mysql数据库的db表中插入一条记录:use mysql;insert into db values('192.168.88.234','%','xuys','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');update db set host = '%' where user = 'xuys'; 重复执行上面的第2、3步。
      【zhuokai】:Socket.RemoteAddress Socket.RemoteHost服务器端可以给连接上的客户端发送测试数据,一定时间内回收到客户端反应的可认为在线.【zhuokai】:请参考: http://www.programfan.com/article/showarticle.asp?id=2289 【ylsl917】:我用的API,不是用的控件,我贴出代码来,麻烦大家给我修改一下吧procedure TForm1.OnWork1Accept(var message: TMessage);VarClient_Addr: TSockAddr;ClientLen: Integer;s:string;beginFillChar(Client_Addr,Sizeof(Client_Addr),0);ClientLen := Sizeof(Client_Addr);Conn_Socket := Accept(Server_Socket,@Client_Addr,@ClientLen);{ 能不能在这里判断出建立的这个Comm_Socket 是哪台机器建立的,其IP是多少?}//读取/关闭 事件WSAAsyncSelect(Conn_Socket, Form1.Handle, WM_WORK1_READ, FD_READ or FD_CLOSE);end;【ylsl917】:解决了,只要 Client_Addr.sin_addr.S_addr 转换成字符串IP就行了 function IPIntToStr(I:Integer):String;varsinaddr:in_addr;beginsinaddr.S_addr:=i;result:=String(inet_ntoa(sinaddr));end;【ylsl917】:还有谁上来说说怎么做到长连接!!!【wj19781215】:自己定义活动包探测客户端是否在线,不要用windows的全局活动包检测,至于长连接就是tcp哦。【ylsl917】:谢谢楼上的 还有一个问题啊我用API实现socket 能不能让程序既是服务器端,又是客户端【zhuokai】: 我用API实现socket 能不能让程序既是服务器端,又是客户端意思是在同一个程序里客户端连接服务器?可以的,多个线程【wj19781215】:用getsockname和getpeername【abcdefgdeng】:在socketserver的onAccept事件中用Socket.RemoteAddress读取【ylsl917】: 我用API实现socket 能不能让程序既是服务器端,又是客户端意思是在同一个程序里客户端连接服务器?可以的,多个线程
      客户端源码(uClientMain.pas): unit uClientMain;interfaceusesWindows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,ScktComp, ComCtrls, ToolWin, ExtCtrls, StdCtrls, Buttons;constSocketHost = '172.16.1.6'; //服务器端地址typeTfrmClientMain = class(TForm)ControlBar1: TControlBar;ToolBar1: TToolBar;tbConnected: TToolButton;tbSend: TToolButton;tbClose: TToolButton;tbDisconnected: TToolButton;ClientSocket: TClientSocket;Edit1: TEdit;Memo1: TMemo;StatusBar: TStatusBar;btnSend: TBitBtn;procedure tbConnectedClick(Sender: TObject);procedure tbDisconnectedClick(Sender: TObject);procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);procedure tbSendClick(Sender: TObject);procedure tbCloseClick(Sender: TObject);procedure FormShow(Sender: TObject);procedure ClientSocketConnect(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocketConnecting(Sender: TObject;Socket: TCustomWinSocket);procedure ClientSocketDisconnect(Sender: TObject;Socket: TCustomWinSocket);procedure FormClose(Sender: TObject; var Action: TCloseAction);procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket;ErrorEvent: TErrorEvent; var ErrorCode: Integer);private{ Private declarations }public{ Public declarations } end;
      ClientSocket组件为客户端组件。它是通信的请求方,也就是说,它是主动地与服务器端建立连接。 ServerSocket组件为服务器端组件。它是通信的响应方,也就是说,它的动作是监听以及被动接受客户端的连接请求,并对请求进行回复。ServerSocket组件可以同时接受一个或多个ClientSocket组件的连接请求,并与每个ClientSocket组件建立单独的连接,进行单独的通信。因此,一个服务器端可以为多个客户端服务。设计思路本例包括一个服务器端程序和一个客户端程序。客户端程序可以放到多个计算机上运行,同时与服务器端进行连接通信。本例的重点,一是演示客户端与服务器端如何通信;二是当有多个客户端同时连接到服务器端时,服务器端如何识别每个客户端,并对请求给出相应的回复。为了保证一个客户端断开连接时不影响其它客户端与服务器端的通信,同时保证服务器端能够正确回复客户端的请求,在本例中声明了一个记录类型:typeclient_record=recordCHandle: integer; //客户端套接字句柄CSocket:TCustomWinSocket; //客户端套接字CName:string; //客户端计算机名称CAddress:string; //客户端计算机IP地址CUsed: boolean; //客户端联机标志end;利用这个记录类型数据保存客户端的信息,同时保存当前客户端的连接状态。其中,CHandle保存客户端套接字句柄,以便准确定位每个与服务器端保持连接的客户端;Csocket保存客户端套接字,通过它可以对客户端进行回复。Cused记录当前客户端是否与服务器端保持连接。下面对组件ServerSocket和ClientSocket的属性设置简单说明。ServerSocket的属性:· Port,是通信的端口,必须设置。在本例中设置为1025;· ServerTypt,服务器端读写信息类型,设置为stNonBlocking表示异步读写信息,本例中采用这种方式。· ThreadCacheSize,客户端的最大连接数,就是服务器端最多允许多少客户端同时连接。本例采用默认值10。其它属性采用默认设置即可。ClientSocket的属性:· Port,是通信的端口,必须与服务器端的设置相同。在本例中设置为1025;· ClientType,客户端读写信息类型,应该与服务器端的设置相同,为stNonBlocking表示异步读写信息。· Host,客户端要连接的服务器的IP地址。必须设置,当然也可以在代码中动态设置。 其它属性采用默认设置即可。
      如何在客户端上建立一个Socket与服务器端连接,包括连接的函数?

      自己写了一个Android的APP,想用socket连接服务器,服务器用什么写?需要用什么软件吗?

      不是很复杂。具体思路: 1.在服务器端写一个程序,这程序进行读取数据库中你想要的数据,然后再通过socket服务端发送给客户端。2.写个socket客户端 。 android的不知道是不是这样!
      最近我在在写一个APP,用到了socket,在自己电脑上搭建的服务器,具体过程:用eclipse写Java代码,创建一个serversocket,用来监听客户端的请求;客户端在发送数据前,首先创建一个Socket,然后直接请求服务器即可。
      自己写了一个Android的APP,想用socket连接服务器,服务器用什么写?需要用什么软件吗?

      socket客户端如何连接服务器端

      import java.net.*; import java.lang.*;import java.io.*;public class MySocketServer{public static void main(String args[]) //throws IOException{try{ServerSocket myServer = new ServerSocket(8018);System.out.println("正在监听端口:"+myServer.getLocalPort());Socket myClient = null;boolean flag = true;String InputMessage = null;int c;while(flag){myClient = myServer.accept();//接收客户端的信息,如果不是Stop就继续监听,加个if判断DataInputStream dataIn = new DataInputStream(myClient.getInputStream());//DataInputStream dataIn = new DataInputStream(new BufferedInputStream(myClient.getInputStream()));OutputStream dataOut = myClient.getOutputStream();while( (InputMessage = dataIn.readLine()) != null ){if( InputMessage.equals("stop")){flag = false;break;}else{System.out.println("从客户端接收到的信息是:"+InputMessage);//输入:读取至 末尾-1结束,遇到回车'n'结束:while((c=System.in.read())!= -1){dataOut.write((byte)c);if(c== 'n'){dataOut.flush();break;}}}}dataIn.close();dataOut.close();myClient.close();}myServer.close();}catch(Exception e){System.out.println(e.getMessage());}}}客户端:import java.io.*;import java.lang.*;import java.net.*;public class MySocketClient{public static void main(String args[]){try{Socket myClient = new Socket("192.168.1.25",8018);DataInputStream dataIn = new DataInputStream(myClient.getInputStream());OutputStream dataOut = myClient.getOutputStream();boolean flag = true;int c;String serverResponse = null ;while(flag){while( (c=System.in.read())!= -1 ){dataOut.write((byte)c);if(c=='n'){dataOut.flush();serverResponse = dataIn.readLine();System.out.println("服务器的返回信息是:"+serverResponse);}}}dataIn.close();dataOut.close();myClient.close();}catch(Exception e){System.out.println("Exception :"+e.getMessage());}} }
      socket客户端如何连接服务器端

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/312958.html

          热门文章

          文章分类