如何建立"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进行客户端和服务器端的通信
下载完成后,软件是一个单独的运行程序,可以直接打开软件。 3软件的界面很简单,在左侧有tcp和udp的客户端或服务端的快捷按钮,上方有【创建】【删除】【退出】等选项按钮。4我们先来建立TCP的测试服务端。点击【TCP Server】再点击【创建】。选择一个监听端口,这里我们使用6001作为服务端的监听端口。建立完成后,服务端会自动启动,软件会显示【启动监听】的状态。我们可以检测一下本机的6001端口是否已经打开。在DOS窗口中输入命令【netstat -a】,可以在列表中看到本机的6001端口的状态为listening的状态,表示本机的6001端口正处于监听的状态。在DOS窗口中输入命令【telnet 192.168.0.140 6001】来登录本地的6001端口。点击回车键,就可以成功登录6001端口。在测试软件中就可以看到状态是已连接的状态,同时也可以看到对方的ip就是本地ip。再来测试通信情况,在DOS窗口中输入a、b、c,在软件的接收窗口就可以看到收到的数据了。在软件的发送窗口中输入1234567890,点击发送后,在DOS窗口中就可以看到软件发送过来的数据了。测试完成后,在软件中点击【停止监听】,同时在DOS窗口中可以看到【失去了跟主机的连接】,表示测试连接已经断开。再来创建TCP的客户端,点击【TCP Client】再点击【创建】。会弹出【创建socket客户端】窗口,输入对方的ip和对方的端口,点击确认。 tcp的客户端已经建立好,如果对方的端口监听正常的话,点击【连接】就可以连接到对方的端口和对方进行测试通信了。

服务器与服务器用socket是怎么通信的
//上传文件 Socket socket = new Socket("192.168.0.240", 7878);OutputStream outputStream = socket.getOutputStream();String head = "Content-Length=" + audioFile.length()+ ";filename=" + audioFile.getName()+ ";sourceid=rn";outputStream.write(head.getBytes());PushbackInputStream inStream = new PushbackInputStream(socket.getInputStream());String response = StreaTool.readLine(inStream);String[] items = response.split(";");String position = items[1].substring(items[1].indexOf("=") + 1);RandomAccessFile fileOutStream = new RandomAccessFile(audioFile, "r");fileOutStream.seek(Integer.valueOf(position));byte[] buffer = new byte[1024];int len = -1;while ((len = fileOutStream.read(buffer)) != -1){outputStream.write(buffer, 0, len);}fileOutStream.close();outputStream.close();socket.close();audioFile.delete(); } cat

如何在客户端上建立一个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客户端如何连接服务器端
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());}} }

本文由 在线网速测试 整理编辑,转载请注明出处。