您当前的位置:首页 > 美文摘抄 > 内容

socket编程(请问Socket编程的基本步骤是怎样的最好能写一个简单的程序Java演示一下,主要是接受数据谢谢!)

本文目录

  • 请问Socket编程的基本步骤是怎样的最好能写一个简单的程序Java演示一下,主要是接受数据谢谢!
  • Socket编程的几种模式
  • SOCKET编程
  • C语言socket编程
  • socket编程到底是什么
  • C语言socket编程怎么实现2个客户端之间通信
  • 在windows下,如何用纯C语言实现socket网络编程

请问Socket编程的基本步骤是怎样的最好能写一个简单的程序Java演示一下,主要是接受数据谢谢!

SERVER端:--------------------------------------------------------import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server extends Thread {    private Socket clientSocket;    public Server(Socket clientSocket) {        this.clientSocket = clientSocket;    }    public void run() {        DataInputStream dis = null;        DataOutputStream dos = null;        try {            dis = new DataInputStream(clientSocket.getInputStream());            dos = new DataOutputStream(clientSocket.getOutputStream());            while (true) {                String temp = dis.readUTF();                if (“over“.equals(temp)) {                    break;                }                dos.writeUTF(“from server:“ + temp);            }        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (dis != null) {                    dis.close();                }                if (dis != null) {                    dos.close();                }                if (clientSocket != null) {                    clientSocket.close();                }            } catch (IOException e) {            }        }    }    public static void main(String args) throws Exception {        ServerSocket ss = new ServerSocket(8008);        while (true) {            Socket clientSocket = ss.accept();            // 针对每个客户端, 启一个Server线程专门处理此客户端的请求。            Server server = new Server(clientSocket);            server.start();        }    }}CLIENT端:----------------------------------------import java.io.BufferedReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.InputStreamReader;import java.net.Socket;public class Client {    public static void main(String args) throws Exception {        // 输入流1, 从键盘进入Client。        InputStreamReader isr = new InputStreamReader(System.in);        BufferedReader br = new BufferedReader(isr);        Socket clientSocket = new Socket(“127.0.0.1“, 8008);        // 输入流2, 从服务器端进入Client的流对象。        DataInputStream dis = new DataInputStream(clientSocket.getInputStream());        // 输出流, 从Client出去, 到服务器端。        DataOutputStream dos = new DataOutputStream(clientSocket.getOutputStream());        while (true) {            // 从键盘输入读取            String msg = br.readLine();            // 将读取信息发送给服务器端            dos.writeUTF(msg);            //输入QUIT退出            if (“QUIT“.equals(msg)) {                break;            }            //读取从服务器返回的信息            String temp = dis.readUTF();            System.out.println(temp);        }        br.close();        dis.close();        dos.close();        clientSocket.close();    }}

Socket编程的几种模式

其基本原理是:首先建立一个socket连接,然后对其进行操作,比如,从该socket读数据。因为网络传输是要一定的时间的,即使网络通畅的情况下,接受数据的操作也要花费时间。对于一个简单的单线程程序,接收数据的过程是无法处理其他操作的。比如一个窗口程序,当你接收数据时,点击按钮或关闭窗口操作都不会有效。它的缺点显而易见,一个线程你只能处理一个 socket,用来教课还行,实际使用效果就不行了。select模型 为了处理多个socket连接,聪明的人们发明了select模型。该模型以集合来管理socket连接,每次去查询集合中的socket状态,从而达到处理多连接的能力,其函数原型是int select(int nfds, fd_set FAR * readfds, fd_set FAR * writefds, fd_set FAR * exceptfds, const struct timeval FAR * timeout)。比如我们判断某个socket是否有数据可读,我们首先将一个fdread集合置空,然后将socket加入到该集合,调用 select(0,&fdread,NULL,NULL,NULL),之后我们判断socket是否还在fdread中,如果还在,则说明有数据可读。数据的读取和阻塞模型相同,调用recv函数。但是每个集合容量都有一个限值,默认情况下是64个,当然你可以重新定义它的大小,但还是有一个最上限,自己设置也不能超过该值,一般情况下是1024。尽管select模型可以处理多连接,但集合的管理多少让人感到繁琐。异步选择模型 熟悉windows操作系统的都知道,其窗口处理是基于消息的。人们又发明了一种新的网络模型——WSAAsyncSelect模型,即异步选择模型。该模型为每个socket绑定一个消息,当socket上出现事先设置的socket事件时,操作系统就会给应用程序发送这个消息,从而对该 socket事件进行处理,其函数原型是int WSAAsynSelect(SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent)。hWnd指明接收消息的句柄,wMsg指定消息ID,lEvent按位设置感兴趣的网络事件,入 WSAAsyncSelect(s,hwnd,WM_SOCKET, FD_CONNECT | FD_READ | FD_CLOSE)。该模型的优点是在系统开销不大的情况下同时处理许多连接,也不需要什么集合管理。缺点很明显,即使你的程序不需要窗口,也要专门为 WSAAsyncSelect模型定义一个窗口。另外,让单个窗口去处理成千上万的socket操作事件,很可能成为性能瓶颈。事件选择模型 与WSAAsynSelect模型类似,人们还发明了WSAEventSelect模型,即事件选择模型。看名字就可以猜测出来,它是基于事件的。WSAAsynSelect模型在出现感兴趣的socket事件时,系统会发一个相应的消息。而WSAEventSelect模型在出现感兴趣的socket事件时,系统会将相应WSAEVENT事件设为传信。可能你现在对sokect事件和普通WSAEVENT事件还不是很清楚。 socket事件是与socket操作相关的一些事件,如FD_READ,FD_WRITE,FD_ACCEPT等。而WSAEVENT事件是传统的事件,该事件有两种状态,传信(signaled)和未传信(non-signaled)。所谓传信,就是事件发生了,未传信就是还没有发生。我们每次建立一个连接,都为其绑定一个事件,等到该连接变化时,事件就会变为传信状态。那么,谁去接受这个事件变化呢?我们通过一个 WSAWaitForMultipleEvents(...)函数来等待事件发生,传入参数中的事件数组中,只有有一个事件发生,该函数就会返回(也可以设置为所有事件发生才返回,在这里没用),返回值为事件的数组序号,这样我们就知道了哪个事件发生了,也就是该事件对应的socket有了socket操作事件。该模型比起WSAAsynSelect模型的优势很明显,不需要窗口。唯一缺点是,该模型每次只能等待64个事件,这一限制使得在处理多 socket时,有必要组织一个线程池,伸缩性不如后面要讲的重叠模型。重叠I/O(Overlapped I/O)模型重叠I/O(Overlapped I/O)模型使应用程序达到更佳的系统性能。重叠模型的基本设计原理是让应用程序使用重叠数据结构,一次投递一个或多个Winsock I/O请求。重叠模型到底是什么东西呢?可以与WSAEventSelect模型做类比(其实不恰当,后面再说),事件选择模型为每个socket连接绑定了一个事件,而重叠模型为每个socket连接绑定了一个重叠。当连接上发生socket事件时,对应的重叠就会被更新。其实重叠的高明之处在于,它在更新重叠的同时,还把网络数据传到了实现指定的缓存区中。我们知道,前面的网络模型都要用户自己通过recv函数来接受数据,这样就降低了效率。我们打个比方,WSAEventSelect模型就像邮局的包裹通知,用户收到通知后要自己去邮局取包裹。而重叠模型就像送货上门,邮递员发给你通知时,也把包裹放到了你事先指定的仓库中。重叠模型又分为事件通知和完成例程两种模式。在分析这两种模式之前,我们还是来看看重叠数据结构:typedef struct WSAOVERLAPPED{DWORD Internal;DWORD InternalHigh;DWORD Offset;DWORD OffsetHigh;WSAEVENT hEvent;}WSAOVERLAPPED, FAR * LPWSAOVERLAPPED;该数据结构中,Internal、InternalHigh、Offset、OffsetHigh都是系统使用的,用户不用去管,唯一关注的就是 hEvent。如果使用事件通知模式,那么hEvent就指向相应的事件句柄。如果是完成例程模式,hEvent设为NULL。我们现在来看事件通知模式,首先创建一个事件hEvent,并创建一个重叠结构AcceptOverlapped,并设置AcceptOverlapped.hEvent = hEvent,DataBuf是我们事先设置的数据缓存区。调用 WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,NULL),则将AcceptSocket与AcceptOverlapped重叠绑定在了一起。当接收到数据以后,hEvent就会设为传信,而数据就会放到 DataBuf中。我们再通过WSAWaitForMultipleEvents(...)接收到该事件通知。这里我们要注意,既然是基于事件通知的,那它就有一个事件处理上限,一般为64。完成例程和事件通知模式的区别在于,当相应的socket事件出现时,系统会调用用户事先指定的回调函数,而不是设置事件。其实就是将WSARecv的最后一个参数设为函数指针。该回调函数的原型如下:void CALLBACK CompletionROUTINE(DWORD dwError,DWORD cbTransferred,LPWSAOVERLAPPED lpOverlapped,DWORD dwFlags);其中,cbTransferred表示传输的字节数,lpOverlapped是发生socket事件的重叠指针。我们调用 WSARecv(AcceptSocket,&DataBuf,1,&RecvBytes,&Flags,&AcceptOverlapped,WorkerRoutine) 将AcceptSocket与WorkRoutine例程绑定。这里有一点小提示,当我们创建多个socket的连接时,最好把重叠与相应的数据缓存区用一个大的数据结构放到一块,这样,我们在例程中通过lpOverlapped指针就可以直接找到相应的数据缓存区。这里要注意,不能将多个重叠使用同一个数据缓存区,这样在多个重叠都在处理时,就会出现数据混乱。完成端口模型 下面我们来介绍专门用于处理为数众多socket连接的网络模型——完成端口。因为需要做出大量的工作以便将socket添加到一个完成端口,而其他方法的初始化步骤则省事多了,所以对新手来说,完成端口模型好像过于复杂了。然而,一旦弄明白是怎么回事,就会发现步骤其实并非那么复杂。所谓完成端口,实际是Windows采用的一种I/O构造机制,除套接字句柄之外,还可以接受其他东西。使用这种模式之前,首先要创建一个I/O完成端口对象,该函数定义如下:HANDLE CreateIoCompletionPort(HANDLE FileHandle,HANDLE ExistingCompletionPort,DWORD CompletionKey,DWORD NumberOfConcurrentThreads);该函数用于两个截然不同的目的:1)用于创建一个完成端口对象。2)将一个句柄同完成端口关联到一起。通过参数NumberOfConcurrentThreads,我们可以指定同时运行的线程数。理想状态下,我们希望每个处理器各自负责一个线程的运行,为完成端口提供服务,避免过于频繁的线程任务切换。对于一个socket连接,我们通过 CreateIoCompletionPort((HANDLE)Accept,CompletionPort, (DWORD)PerHandleData,0)将Accept连接与CompletionPort完成端口绑定到一起,CompetionPort对应的那些线程不断通过GetQueuedCompletionStatus来查询与其关联的socket连接是否有I/O操作完成,如果有,则做相应的数据处理,然后通过WSARecv将该socket连接再次投递,继续工作。完成端口在性能和伸缩性方面表现都很好,相关联的socket连接数目没有限制。

SOCKET编程

#include 《string.h》 #include 《winsock.h》 #include 《windows.h》 #include 《iostream.h》 #pragma comment (lib,“ws2_32.lib“) int main (int argc, char *argv) { int iportFrom,iportTo; int testsocket; int iopenedport = 0; struct sockaddr_in target_addr; WSADATA wsaData; WORD wVersionRequested=MAKEWORD(1,1); if (argc 《= 3) { cout 《《 “使用格式 : “ 《《 argv 《《 “ 主机IP地址 开始端口号 结束端口号\n“ 《《 endl; exit(1); } if (atoi (argv) 》 atoi (argv)) { cout 《《 “错误!开始端口号必须小于结束端口号“ 《《 endl; exit(1); } else { if (WSAStartup (wVersionRequested , &wsaData) ) { cout 《《 “连接socket库失败,请检查版本号是否为1.1\n“ 《《 endl; exit(1); } iportFrom=atoi (argv); iportTo=atoi (argv); for (int i=iportFrom; i 《= iportTo; i++) { cout 《《 “正在建立socket................................“ 《《 endl; if ((testsocket=socket (AF_INET,SOCK_STREAM,0) ) == INVALID_SOCKET) { cout 《《 “Socket建立失败!“ 《《 endl; exit(0); } target_addr.sin_family = AF_INET; target_addr.sin_port = htons(i); target_addr.sin_addr.s_addr = inet_addr (argv); cout 《《 “正在扫描端口:“ 《《 i 《《 endl; if (connect (testsocket, (struct sockaddr *) ⌖_addr, sizeof(struct sockaddr)) == SOCKET_ERROR) cout 《《 “端口“ 《《 i 《《 “关闭!“ 《《 endl; else { iopenedport++; cout 《《 “端口“ 《《 i 《《 “开放\n“ 《《 endl; } } cout 《《 “目标主机“ 《《 argv 《《 “从“ 《《 iportFrom 《《 “--“ 《《 iportTo 《《 “共有“ 《《 iopenedport 《《 “个端口开放“ 《《 endl; closesocket (testsocket); WSACleanup(); } return 0; } vc6.0 下 编译

C语言socket编程

这不是很简单,加个在send前面加个char password=“12345“printf(“please enter the password:“);scanf(“%s“,importpassword);if(0==strcmp(password,importpassword)){ 连接。。。send();}else 退出。或者这里还可以写个循环输入也可如果需要用户名就麻烦多了。不多说了,求采纳,有问必答

socket编程到底是什么

socket 其实就是操作系统提供给程序员操作「网络协议栈」的接口,说人话就是,你能通过socket 的接口,来控制协议找工作,从而实现网络通信,达到跨主机通信。

协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,它们两会接受应用层的委托执行收发数据的操作。

协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。这里需要注意的是,服务端调用 accept 时,连接成功了会返回一个已完成连接的 socket,后续用来传输数据。

所以,监听的 socket 和真正用来传送数据的 socket,是「两个」 socket,一个叫作监听 socket,一个叫作已完成连接 socket。成功连接建立之后,双方开始通过 read 和 write 函数来读写数据,就像往一个文件流里面写东西一样。

C语言socket编程怎么实现2个客户端之间通信

  • 网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

  • 下面用Socket实现一个windows下的c语言socket通信例子,这里我们客户端传递一个字符串,服务器端进行接收。

    【服务器端】#include “stdafx.h“#include 《stdio.h》#include 《winsock2.h》#include 《winsock2.h》#define SERVER_PORT 5208 //侦听端口void main(){    WORD wVersionRequested;    WSADATA wsaData;    int ret, nLeft, length;    SOCKET sListen, sServer; //侦听套接字,连接套接字    struct sockaddr_in saServer, saClient; //地址信息       char *ptr;//用于遍历信息的指针       //WinSock初始化    wVersionRequested=MAKEWORD(2, 2); //希望使用的WinSock DLL 的版本    ret=WSAStartup(wVersionRequested, &wsaData);    if(ret!=0)    {        printf(“WSAStartup() failed!\n“);        return;    }    //创建Socket,使用TCP协议    sListen=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (sListen == INVALID_SOCKET)    {        WSACleanup();        printf(“socket() faild!\n“);        return;    }    //构建本地地址信息    saServer.sin_family = AF_INET; //地址家族    saServer.sin_port = htons(SERVER_PORT); //注意转化为网络字节序    saServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //使用INADDR_ANY 指示任意地址     //绑定    ret = bind(sListen, (struct sockaddr *)&saServer, sizeof(saServer));    if (ret == SOCKET_ERROR)    {        printf(“bind() faild! code:%d\n“, WSAGetLastError());        closesocket(sListen); //关闭套接字        WSACleanup();        return;    }     //侦听连接请求    ret = listen(sListen, 5);    if (ret == SOCKET_ERROR)    {        printf(“listen() faild! code:%d\n“, WSAGetLastError());        closesocket(sListen); //关闭套接字        return;    }     printf(“Waiting for client connecting!\n“);    printf(“Tips: Ctrl+c to quit!\n“);    //阻塞等待接受客户端连接 while(1)//循环监听客户端,永远不停止,所以,在本项目中,我们没有心跳包。 {  length = sizeof(saClient);  sServer = accept(sListen, (struct sockaddr *)&saClient, &length);  if (sServer == INVALID_SOCKET)  {   printf(“accept() faild! code:%d\n“, WSAGetLastError());   closesocket(sListen); //关闭套接字   WSACleanup();   return;  }         char receiveMessage;   nLeft = sizeof(receiveMessage);  ptr = (char *)&receiveMessage;  while(nLeft》0)  {   //接收数据   ret = recv(sServer, ptr, 5000, 0);   if (ret == SOCKET_ERROR)   {    printf(“recv() failed!\n“);    return;   }   if (ret == 0) //客户端已经关闭连接   {    printf(“Client has closed the connection\n“);    break;   }   nLeft -= ret;   ptr += ret;  }      printf(“receive message:%s\n“, receiveMessage);//打印我们接收到的消息。  }  //  closesocket(sListen);  //  closesocket(sServer);  //  WSACleanup();}【客户端】#include “stdafx.h“#include 《stdio.h》#include 《stdlib.h》#include 《winsock2.h》#define SERVER_PORT 5208 //侦听端口void main(){   WORD wVersionRequested;   WSADATA wsaData;   int ret;   SOCKET sClient; //连接套接字   struct sockaddr_in saServer; //地址信息   char *ptr;   BOOL fSuccess = TRUE;   //WinSock初始化   wVersionRequested = MAKEWORD(2, 2); //希望使用的WinSock DLL的版本   ret = WSAStartup(wVersionRequested, &wsaData);   if(ret!=0)   {        printf(“WSAStartup() failed!\n“);        return;   }   //确认WinSock DLL支持版本2.2   if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)   {        WSACleanup();        printf(“Invalid WinSock version!\n“);        return;   }   //创建Socket,使用TCP协议   sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   if (sClient == INVALID_SOCKET)   {        WSACleanup();        printf(“socket() failed!\n“);        return;   }   //构建服务器地址信息   saServer.sin_family = AF_INET; //地址家族   saServer.sin_port = htons(SERVER_PORT); //注意转化为网络节序   saServer.sin_addr.S_un.S_addr = inet_addr(“192.168.1.127“);   //连接服务器   ret = connect(sClient, (struct sockaddr *)&saServer, sizeof(saServer));   if (ret == SOCKET_ERROR)   {        printf(“connect() failed!\n“);        closesocket(sClient); //关闭套接字        WSACleanup();        return;   }     char sendMessage=“hello this is client message!“;   ret = send (sClient, (char *)&sendMessage, sizeof(sendMessage), 0);   if (ret == SOCKET_ERROR)   {        printf(“send() failed!\n“);   }   else        printf(“client info has been sent!“);   closesocket(sClient); //关闭套接字   WSACleanup();}

  • 在windows下,如何用纯C语言实现socket网络编程

    mfc只是对socket进行了一些封装,大部分人做网络编程都是用的原始的socket,比如如下接口都可以在c下进行调用1.socket()2.bind()3.connect()4.listen()5.accept()6.send()和recv()7.sendto()和recvfrom()8.close()和shutdown()9.getpeername()10.gethostname()这些接口是在Winsock2.h中定义的不是在mfc中定义的,你只需要包含Winsock2.h头文件和Ws2_32.lib库就可以了。


    声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

    上一篇: 高情商的暖心句子,高情商的暖心句子简短(11月初起农村开始进行人口普查)

    下一篇: 海蓝宝的功效与作用,海蓝宝的作用与功效(世界上最不可思议的十大骗局)



    推荐阅读

    网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号