socket方法(socket方法和属性详解)

      最后更新:2023-05-26 02:08

      java socket 使用方法

      Socket.getPort(); //获取客户端的端口Socket.getInetAddress();//获取客户端的地址信息返回InetAddress对象 InetAddress对象里面都是你要的信息,具体可以查JDK文档
      java socket 使用方法

      如何建立"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的方法如何实现。

      TCP方式: TCP协议客户端实现://创建一个Socket对象,指定服务器端的IP地址和端口号Socketsocket=newSocket("192.168.1.104",4567);//使用InputStream读取硬盘上的文件,这里只是用文件当做信息源,可以读取控件用户输入信息InputStreaminputStream=newFileInputStream("f://file/words.txt");//从Socket当中得到OutputStreamOutputStream outputStream=socket.getOutputStream();bytebuffer[]=newbyte[4*1024];inttemp=0;//将InputStream当中的数据取出,并写入到OutputStream当中while((temp=inputStream.read(buffer))!=-1)5{outputStream.write(buffer,0,temp);}outputStream.flush();}TCP协议服务器端实现://声明一个ServerSocket对象ServerSocketserverSocket=null;try{//创建一个ServerSocket对象,并让这个Socket在4567端口监听serverSocket=newServerSocket(4567);//调用ServerSocket的accept()方法,接受客户端所发送的请求,//如果客户端没有发送数据,那么该线程就停滞不继续Socketsocket=serverSocket.accept();//从Socket当中得到InputStream对象InputStreaminputStream=socket.getInputStream();bytebuffer[]=newbyte[1024*4];inttemp=0;//从InputStream当中读取客户端所发送的数据while((temp=inputStream.read(buffer))!=-1){System.out.println(newString(buffer,0,temp));}}catch(IOExceptione){e.printStackTrace();}serverSocket.close();}UDP方式UDP的客户端代码实现如下:public static void main(String[]args){try{//首先创建一个DatagramSocket对象DatagramSocket socket=new DatagramSocket(4567);//创建一个InetAddree6InetAddress serverAddress=InetAddress.getByName("192.168.1.104");String str="hello";//这是要传输的数据byte data[]=str.getBytes();//把传输内容分解成字节//创建一个DatagramPacket对象,并指定要讲这个数据包发送到网络当中的哪个地址,以及端口号DatagramPacket packet=newDatagramPacket(data,data.length,serverAddress,4567);//调用socket对象的send方法,发送数据socket.send(packet);}catch(Exceptione){e.printStackTrace();}}UDP的服务端代码实现如下://创建一个DatagramSocket对象,并指定监听的端口号DatagramSocket socket=new DatagramSocket(4567);bytedata[]=newbyte[1024];//创建一个空的DatagramPacket对象DatagramPacket packet=new DatagramPacket(data,data.length);//使用receive方法接收客户端所发送的数据,//如果客户端没有发送数据,该进程就停滞在这里socket.receive(packet);Stringresult=newString(packet.getData(),packet.getOffset(),packet.getLength()); System.out.println("result--->"+result);
      我想问下如何在手机上建立一个服务器,用Socket的方法如何实现。

      android socket有几种方法

      /***第一种:客户端Socket通过构造方法连接服务器***/ //客户端Socket可以通过指定IP地址或域名两种方式来连接服务器端,实际最终都是通过IP地址来连接服务器//新建一个Socket,指定其IP地址及端口号Socket socket = new Socket("192.168.0.7",80);/***Socket 客户端 一些常用设置***///客户端socket在接收数据时,有两种超时:1.连接服务器超时,即连接超时;2.连接服务器成功后,接收服务器数据超时,即接收超时//*设置socket 读取数据流的超时时间socket.setSoTimeout(5000);//发送数据包,默认为false,即客户端发送数据采用Nagle算法;//但是对于实时交互性高的程序,建议其改为true,即关闭Nagle算法,客户端每发送一次数据,无论数据包大小都会将这些数据发送出去socket.setTcpNoDelay(true);//设置客户端socket关闭时,close()方法起作用时延迟1分钟关闭,如果1分钟内尽量将未发送的数据包发送出去socket.setSoLinger(true, 60);//设置输出流的发送缓冲区大小,默认是8KB,即8096字节socket.setSendBufferSize(8096);//设置输入流的接收缓冲区大小,默认是8KB,即8096字节socket.setReceiveBufferSize(8096);//作用:每隔一段时间检查服务器是否处于活动状态,如果服务器端长时间没响应,自动关闭客户端socket//防止服务器端无效时,客户端长时间处于连接状态socket.setKeepAlive(true);/*** Socket客户端向服务器端发送数据 ****///客户端向服务器端发送数据,获取客户端向服务器端输出流OutputStream os = socket.getOutputStream();OutputStreamWriter osw = new OutputStreamWriter(os);BufferedWriter bw = new BufferedWriter(osw);//代表可以立即向服务器端发送单字节数据socket.setOOBInline(true);//数据不经过输出缓冲区,立即发送socket.sendUrgentData(65);//"A"//向服务器端写数据,写入一个缓冲区//注:此处字符串最后必须包含“rnrn”,告诉服务器HTTP头已经结束,可以处理数据,否则会造成下面的读取数据出现阻塞//在write()方法中可以定义规则,与后台匹配来识别相应的功能,例如登录Login()方法,可以写为write("Login|test,123 rnrn"),供后台识别;bw.write("Login|test,123 rnrn");//发送缓冲区中数据,必须有bw.flush();/*** Socket客户端读取服务器端响应数据 ****///socket.isConnected代表是否连接成功过if((socket.isConnected() == true) && (socket.isClosed() == false)){//判断Socket是否处于连接状态//客户端接收服务器端的响应,读取服务器端向客户端的输入流InputStream is = socket.getInputStream();//缓冲区byte[] buffer = new byte[is.available()];//读取缓冲区is.read(buffer);//转换为字符串String responseInfo = new String(buffer);//日志中输出Log.i("TEST", responseInfo);} //关闭网络socket.close();/***第二种:通过connect方法连接服务器***/Socket socket_other = new Socket();//使用默认的连接超时socket_other.connect(new InetSocketAddress("192.168.0.7",80));//连接超时2ssocket_other.connect(new InetSocketAddress("192.168.0.7",80),2000);//关闭socketsocket_other.close();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace(); }
      android socket有几种方法

      使用socket模块中的什么方法可以创建一个socket对象

      方法一: 第一步,可以先创建socket objSocket=null,但不实例化先第二步,在需要的地方进行实例化,例如构造方法中等等方法二: 直接创建并实例化
      使用socket模块中的什么方法可以创建一个socket对象

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

          热门文章

          文章分类