客户端和服务端通过建立socket通信,协议是tcp/ip

有一个问题咨询:一个客户端和一个服务端通过tcp/ip连接(之间建立socket通信),在不断网的情况下,服务端关闭,客户端报警,重新开启服务器,客户端能够重新连接上服务端,但是如果拔掉网线,客户端就连接不上服务端了,但从服务端发送过来的数据还是可以读到,可是从客户端发送的数据不能到达服务端,这是为什么???

1个回答

问题不清楚。拔了网线肯定不能收发的。接上网线后应该进行重连操作(软件定时重连)。

无论客户端 服务器都要开启一个socket ,这样才能收发, 然后对事件进而函数操作。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
TCP/IP客户端与服务器之间的通信问题。。急求解决方法!!!!!
在做一个项目,问题,客户端和服务器端可以都开两个线程。即客户端打开线程1和线程2,服务器端打开线程1和线程2。在通信过程中服务器线程1与客户端线程1通信,服务器线程2与客户端线程2通信,这样子怎么实现呢???急求
C语言 socket 编写简单服务端客户端通信问题
大家好,感谢你的回复。 我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。 Talk is cheak , show me the code. 服务端代码: ```#include<stdio.h> #include<stdlib.h> #include<WinSock2.h> #pragma comment(lib,"ws2_32.lib") int main(){ WSADATA wsd; SOCKET sockServer; SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号 SOCKET sockClient; SOCKADDR_IN clientaddr; WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口 sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket if (sockServer != -1 && sockServer != INVALID_SOCKET){ printf("Socket has been created :%d", sockServer); } else{ printf("Socket create failed."); exit(0); } serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(6000);//绑定端口6000 int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR)); char recvBuf[100]; int len = sizeof(SOCKADDR); listen(sockServer, 5);//5为等待连接数 while (1){ sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len); //接收客户端数据 recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); printf("to me:%s\n",recvBuf); memset(recvBuf, 0, 100); } closesocket(sockClient); system("pause"); return 0; } ``` 客户端代码: ``` #include<winsock2.h> #include<stdio.h> #pragma comment(lib, "ws2_32.lib") void main() { WSADATA wsaData; SOCKET sockClient;//客户端Socket SOCKADDR_IN addrServer;//服务端地址 WSAStartup(MAKEWORD(2, 2), &wsaData); char message[20] = "HelloSocket!"; //定义要连接的服务端地址 addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址) addrServer.sin_family = AF_INET; addrServer.sin_port = htons(6000);//连接端口6000 //新建客户端socket sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); int s = 0; s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); while (1){ //发送数据 int a = send(sockClient, message, strlen(message) + 1, 0); printf("to server:"); scanf("%s", message); } //关闭socket closesocket(sockClient); WSACleanup(); } ``` 求懂的高手来解答一下。 谢谢了!
C++基础tcp通信练习问题 客户端连接服务端失败 返回值10038 求答
客户端代码 ``` #define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WinSock2.h> #include<windows.h> #include<stdio.h> #pragma comment(lib,"ws2_32.lib") int main() { //启动Windows socket2.x环境 WORD ver = MAKEWORD(2, 2); WSADATA dat; WSAStartup(ver, &dat); ///----------------- //1 建立一个socket SOCKET _sock = (AF_INET, SOCK_STREAM, 0); if (INVALID_SOCKET == _sock) { printf("error sock\n"); } else { printf("success sock\n"); } //2 连接服务器 connect sockaddr_in _sin = {}; _sin.sin_family = AF_INET; _sin.sin_port = htons(1234); _sin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); int ret = connect(_sock, (sockaddr*)&_sin, sizeof(_sin)); if (SOCKET_ERROR == ret) { printf("error connect\n"); } else { printf("success connect\n"); } //3 接收服务器信息 recv char recvBuf[256] = {}; int nlen = recv(_sock, recvBuf, 256, 0); if (nlen > 0) { printf("recv:%s", recvBuf); } //4 关闭 closesocket closesocket(_sock); ///----------------- WSACleanup(); getchar(); return 0; } ``` 服务端代码 ``` #define WIN32_LEAN_AND_MEAN #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WinSock2.h> #include<windows.h> #include<stdio.h> #pragma comment(lib,"ws2_32.lib") int main() { //启动Windows socket2.x环境 WORD ver = MAKEWORD(2, 2); WSADATA dat; WSAStartup(ver, &dat); ///----------------- //1 建立一个socket SOCKET _sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //2 bind 绑定用于接受客户端连接的网络端口 sockaddr_in _sin = {}; _sin.sin_family = AF_INET; _sin.sin_port = htons(1234);//htons = host to net unsigned short _sin.sin_addr.S_un.S_addr = INADDR_ANY;//inet_addr("127.0.0.1"); if (SOCKET_ERROR == bind(_sock, (sockaddr*)&_sin, sizeof(_sin))) { printf("bind error\n"); } else { printf("bind success\n"); } //3 listen 监听网络端口 if (SOCKET_ERROR == listen(_sock, 5)) { printf("listen error\n"); } else { printf("listen success\n"); } //4 accept 等待接受客户端连接 sockaddr_in clientAddr = {}; int nAddrLen = sizeof(sockaddr_in); SOCKET _cSock = INVALID_SOCKET; char msgBuf[] = "can't find work"; while (true) { _cSock = accept(_sock, (sockaddr*)&clientAddr, &nAddrLen); if (INVALID_SOCKET == _cSock) { printf("client error\n"); } printf("new client: ip = %s \n", inet_ntoa(clientAddr.sin_addr)); //5 send 向客户端发送一条数据 send(_cSock, msgBuf, strlen(msgBuf) + 1, 0); } //6 closeSocket 关闭 closesocket(_sock); ///----------------- //清除Windows socket 环境 WSACleanup(); return 0; } ``` 运行结果 ![图片说明](https://img-ask.csdn.net/upload/201911/11/1573455848_840860.png) 求大神解答!!!! /////////////////////////////////// 再使用了GetLastError后返回的值是10038
多线程TCP/IP网络编程
编写一个socket通信程序,win32控制台的,可以发送、接收消息和文件。要多线程。C语言的。 客户端和服务端各要有怎样的思路,求指导! --------------------------- 目前思路大致是,服务端,两个子线程,主线程接受连接,一个子线程发送消息,一个子线程接收消息。 客户端,主线程连接,一个子线程发送消息,一个子线程接收消息。 现在有个问题,连接多个客户端后,客户端发送的消息会乱掉,服务器又怎么分辨客户端给特定的客户端发送消息。 还有,怎么传输文件。
安卓蓝牙支持UDP通信吗,Socket连接断了该怎样自从重新连接?
最近需要手机和一个安卓外设使用蓝牙发送消息(一共两句“开始”、“结束“),但手机上的软件需要被第三方软件使用startActivityForResult方法回调,因此如果使用TCP协议的话,每次回调都是对active的重启,那之前建立的socket连接就会断开,发消息又得重新进入外设的软件进行重新建立连接。 因此想用UDP协议通过蓝牙发送消息,外设上的软件只需要监听某个端口就可以了,查看资料蓝牙是支持TCP/UDP/IP协议的,但是查了一整天也没见过讲解或案例,请问一下是没法做吗,如果真没法用UDP,使用socket该怎么解决我之前提出的问题 还有另一个问题,我们通过蓝牙建立socket连接,都是通过软件内打开蓝牙配对链接来获取蓝牙,现在想的是在软件外部先通过系统建立蓝牙连接,然后进入软件获取已连接蓝牙的信息,获取对应的服务端和客户端的两个socket,然后二者建立通信通道,请问怎样获取系统已连接的蓝牙信息
php socket 客户端的多次通信
想用php做一个socket 客户端,可以实现一次连接,然后多次给服务端发消息。具体的想法是这样的: 做一个页面,这个页面上有个按钮和消息栏,点一下按钮就可以把消息栏的内容发送给服务端,再点一下再发送,而不需要重新连接,只是页面打开时跟服务端连接上。 这个要怎么实现呀?请各位大牛帮帮忙,小妹先谢过了。 附上socket类的代码。 <?php /** 定义ip,和端口 */ define ( 'PHP_SOCKET_PORT', '6000' ); define ( 'PHP_SOCKET_HOST', '127.0.0.1' ); define ( 'PHP_SOCKET_START', '' ); define ( 'PHP_SOCKET_END', '' ); // socket class class socket{ var $socket; //socket 句柄 var $sendflag = ">>>"; var $recvflag = "<<<"; var $response; var $debug = 1; function socket($hostname,$port){ $address = gethostbyname($hostname); $this->socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); $result = socket_connect($this->socket,$address,$port); if($this->debug == 1){ if ($result < 0) { $result = "socket_connect() failed.\nReason: ($result) " . socket_strerror($result) . "<br>"; } else{ $result = "connect OK.<br>"; } } } function sendmsg($msg){ socket_write($this->socket,$msg,strlen($msg)); $result = socket_read($this->socket,100); $this->response = $result; if($this->debug == 1){ printf("<font color=#CCCCCC>%s $msg</fon><br>",$this->sendflag); printf("<font color=blue>%s $result</font><br>",$this->recvflag); } return $result; } function close(){ socket_close($this->socket); } } ?>
JAVA客户端与服务端通信问题
public void sendCMD(final byte[] buffer,final String ip) { new Thread(new Runnable() { @Override public void run() { Socket socket=null; try{ socket = new Socket(InetAddress.getByName(ip), Proxys.PORT_RECEIVE + Max); InputStream inputStream = new ByteArrayInputStream(buffer); OutputStream outputStream = socket.getOutputStream(); byte buffer [] = new byte[1024]; int temp=0; while((temp = inputStream.read(buffer)) != -1){ outputStream.write(buffer,0,temp);} outputStream.flush(); } 客户端发送指令给服务端 public void run() { // 消息循环 ServerSocket serverSocket = null; Socket socket = null; try { //定义TCP监听 serverSocket = new ServerSocket(Proxys.PORT_RECEIVE + con.Max); socket = serverSocket.accept(); int temp=0; //定义缓冲区 byte[] buffer=new byte[1024]; String str=""; //定义接收数据包 InputStream inputStream = socket.getInputStream(); while ((temp = inputStream.read(buffer)) != -1) { str=new String(buffer, 0, temp);} 服务端接收客户端发送的流 不知道哪个地方有问题,请大神看一下上面贴上的代码是否有问题 谢谢
socket编程客户端连接失败
想用socket通信,没法解决客户端连接失败,代码是一本书上的实例,书上的都运行不成功吗,大家帮看下问题在那里,谢谢了![图片说明](https://img-ask.csdn.net/upload/201507/13/1436783188_607205.png) 代码如下: 服务器端:################################################### #include<stdio.h> #include<winsock.h> /*引入winsock头文件*/ int main() { /*-----------------------------------------*/ /*------------定义变量---------------------*/ /*-----------------------------------------*/ char Sendbuf[100]; /*发送数据的缓冲区*/ char Receivebuf[100]; /*接受数据的缓冲区*/ int SendLen; /*发送数据的长度*/ int ReceiveLen; /*接收数据的长度*/ int Length; /*表示SOCKADDR的大小*/ SOCKET socket_server; /*定义服务器套接字*/ SOCKET socket_receive; /*定义用于连接套接字*/ SOCKADDR_IN Server_add; /*服务器地址信息结构*/ SOCKADDR_IN Client_add; /*客户端地址信息结构*/ WORD wVersionRequested; /*字(word):unsigned short*/ WSADATA wsaData; /*库版本信息结构*/ int error; /*表示错误*/ /*-----------------------------------------*/ /*------------初始化套接字库---------------*/ /*-----------------------------------------*/ /*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/ wVersionRequested = MAKEWORD( 2, 2 ); /*加载套接字库,初始化Ws2_32.dll动态链接库*/ error = WSAStartup( wVersionRequested, &wsaData); if(error!=0) { printf("加载套接字失败!"); return 0; /*程序结束*/ } /*判断请求加载的版本号是否符合要求*/ if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( ); /*不符合,关闭套接字库*/ return 0; /*程序结束*/ } /*-----------------------------------------*/ /*------------设置连接地址-----------------*/ /*-----------------------------------------*/ Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/ Server_add.sin_addr.S_un.S_addr=htonl(INADDR_ANY);/*主机地址*/ Server_add.sin_port=htons(5000);/*端口号*/ /*------------创建套接字-------------------*/ /*AF_INET表示指定地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议。*/ socket_server=socket(AF_INET,SOCK_STREAM,0); /*-----------------------------------------*/ /*---绑定套接字到本地的某个地址和端口上----*/ /*-----------------------------------------*/ /*socket_server为套接字,(SOCKADDR*)&Server_add为服务器地址*/ if(bind(socket_server,(SOCKADDR*)&Server_add,sizeof(SOCKADDR) )==SOCKET_ERROR) { printf("绑定失败\n"); } /*-----------------------------------------*/ /*------------设置套接字为监听状态---------*/ /*-----------------------------------------*/ /*监听状态,为连接做准备,最大等待的数目为5*/ if(listen(socket_server,5)<0) { printf("监听失败\n"); } /*-----------------------------------------*/ /*------------接受连接---------------------*/ /*-----------------------------------------*/ Length=sizeof(SOCKADDR); /*接受客户端的发送请求,等待客户端发送connect请求*/ socket_receive=accept(socket_server,(SOCKADDR*)&Client_add,&Length); if(socket_receive==SOCKET_ERROR) { printf("接受连接失败"); } /*-----------------------------------------*/ /*--------------进行聊天-------------------*/ /*-----------------------------------------*/ while(1) /*无限循环*/ { /*--------接收数据---------*/ ReceiveLen =recv(socket_receive,Receivebuf,100,0); if(ReceiveLen<0) { printf("接收失败\n"); printf("程序退出\n"); break; } else { printf("client say: %s\n",Receivebuf); } /*--------发送数据---------*/ printf("please enter message:"); scanf("%s",Sendbuf); SendLen=send(socket_receive,Sendbuf,100,0); if(SendLen<0) { printf("发送失败\n"); } } /*-----------------------------------------*/ /*---------释放套接字,关闭动态库----------*/ /*-----------------------------------------*/ closesocket(socket_receive); /*释放客户端的套接字资源*/ closesocket(socket_server);/*释放套接字资源*/ WSACleanup();/*关闭动态链接库*/ return 0; } 客户端:##################################################### #include<stdio.h> #include<winsock.h> /*引入winsock头文件*/ int main() { /*-----------------------------------------*/ /*------------定义变量---------------------*/ /*-----------------------------------------*/ char Sendbuf[100]; /*发送数据的缓冲区*/ char Receivebuf[100]; /*接受数据的缓冲区*/ int SendLen; /*发送数据的长度*/ int ReceiveLen; /*接收数据的长度*/ SOCKET socket_send; /*定义套接字*/ SOCKADDR_IN Server_add; /*服务器地址信息结构*/ WORD wVersionRequested; /*字(word):unsigned short*/ WSADATA wsaData; /*库版本信息结构*/ int error; /*表示错误*/ /*-----------------------------------------*/ /*------------初始化套接字库---------------*/ /*-----------------------------------------*/ /*定义版本类型。将两个字节组合成一个字,前面是第字节,后面是高字节*/ wVersionRequested = MAKEWORD( 2, 2 ); /*加载套接字库,初始化Ws2_32.dll动态链接库*/ error = WSAStartup( wVersionRequested, &wsaData); if(error!=0) { printf("加载套接字失败!"); return 0; /*程序结束*/ } /*判断请求加载的版本号是否符合要求*/ if ( LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 ) { WSACleanup( ); /*不符合,关闭套接字库*/ return 0; /*程序结束*/ } /*-----------------------------------------*/ /*------------设置服务器地址---------------*/ /*-----------------------------------------*/ Server_add.sin_family=AF_INET;/*地址家族,对于必须是AF_INET,注意只有它不是网络网络字节顺序*/ /*服务器的地址,将一个点分十进制表示为IP地址,inet_ntoa是将地址转成字符串*/ Server_add.sin_addr.S_un.S_addr = inet_addr("192.168.1.238"); Server_add.sin_port=htons(5000);/*端口号*/ /*-----------------------------------------*/ /*-------------进行连接服务器--------------*/ /*-----------------------------------------*/ /*客户端创建套接字,但是不需要绑定的,只需要和服务器建立起连接就可以了,*/ /*socket_sendr表示的是套接字,Server_add服务器的地址结构*/ socket_send=socket(AF_INET,SOCK_STREAM,0); /*-----------------------------------------*/ /*-------------创建用于连接的套接字--------*/ /*-----------------------------------------*/ /*AF_INET表示指定地址族,SOCK_STREAM表示流式套接字TCP,特定的地址家族相关的协议。*/ if(connect(socket_send,(SOCKADDR*)&Server_add,sizeof(SOCKADDR)) == SOCKET_ERROR) { printf("连接失败!\n"); } /*-----------------------------------------*/ /*--------------进行聊天-------------------*/ /*-----------------------------------------*/ while(1) /*无限循环*/ { /*---------------发送数据过程----------*/ printf("please enter message:"); scanf("%s",Sendbuf); SendLen = send(socket_send,Sendbuf,100,0); /*发送数据*/ if(SendLen < 0) { printf("发送失败!\n"); } /*--------------接收数据过程---------------*/ ReceiveLen =recv(socket_send,Receivebuf,100,0); /*接受数据*/ if(ReceiveLen<0) { printf("接收失败\n"); printf("程序退出\n"); break; } else { printf("Server say: %s\n",Receivebuf); } } /*-----------------------------------------*/ /*---------释放套接字,关闭动态库----------*/ /*-----------------------------------------*/ closesocket(socket_send);/*释放套接字资源*/ WSACleanup();/*关闭动态链接库*/ return 0; }
窗口中socket通信服务器向客户端发消息,客户端自动返回:繁忙,下面是客户端代码:
// 接收数据信息 public void ReceiveMsg() { while (true) { try { byte[] date = new byte[1024]; int recv = socket.Receive(date); string str = Encoding.UTF8.GetString(date,0,recv); } catch (SocketException ex) { } } } public void listTest(Object o, EventArgs e, String str) { this.richTextBox1.Text = str; } //设置控件状态 public void Status(Object o, EventArgs e) { lblStatus.Text = "连接成功."; button1.Enabled = false; } //回调(异步调用连接请求) private static void ConnectCallback(IAsyncResult er) { try { // 获取到异步操作信息 Socket client = (Socket)er.AsyncState; UpdateStatus(new Form1(), new EventArgs()); StateObjcet state = new StateObjcet(); state.workSocket = client; client.BeginReceive(state.buffer, 0, StateObjcet.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); // Receive(client); // 结束挂起异步连接操作请求 //client.EndConnect(er); } catch(Exception e) { MessageBox.Show(e.ToString()); return; } } //异步发送信息 /// <summary> /// 异步发送 /// </summary> /// <param name="er"></param> private static void SendCallback(IAsyncResult er) { try { //获取异步对象异步操作信息 Socket Client = (Socket)er.AsyncState; //挂起异步 发送请求 int byteSend = Client.EndSend(er); } catch (Exception e) { MessageBox.Show(e.ToString()); } } /// <summary> ///读取Socket 套接字 /// </summary> /// <param name="client"></param> private static void Receive(Socket client) { try { StateObjcet state = new StateObjcet(); state.workSocket=client; client.BeginReceive(state.buffer,0,StateObjcet.BufferSize,0,new AsyncCallback(ReceiveCallback),state); }catch(Exception e) { MessageBox.Show(e.ToString()); } } /// <summary> /// 异步挂起 /// </summary> /// <param name="er"></param> private static void ReceiveCallback(IAsyncResult er) { try { //异步操作获取用户定义信息 StateObjcet state = (StateObjcet)er.AsyncState; Socket client = state.workSocket; //结束挂起异步读取 int bytebuffer = client.EndReceive(er); if (bytebuffer > 0) { UpdateList(new Form1(), new EventArgs(), Encoding.ASCII.GetString(state.buffer, 0, bytebuffer)); state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytebuffer)); client.BeginReceive(state.buffer, 0, StateObjcet.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } else { if (state.sb.Length > 1) { response = state.sb.ToString(); } receiveDone.Set(); client.Close(); } } catch (Exception e) { MessageBox.Show(e.ToString()); } } private void button2_Click(object sender, EventArgs e) { if (richTextBox2.Text.Trim() == "") return; else if (richTextBox2.Text.Trim().ToLower() == "clear()") { richTextBox1.Clear(); richTextBox2.Text = ""; return; } else if (Regex.IsMatch(richTextBox2.Text.Trim().ToLower(), @"^[zoom(]+[\d]+[)]$")) { string str = richTextBox2.Text.ToLower(); int size = Convert.ToInt32(str.Substring(str.LastIndexOf('(') + 1, str.IndexOf(')') - str.LastIndexOf('(') - 1)); richTextBox1.Font = new Font("宋体", size, FontStyle.Bold); return; } try { Byte[] bs; string user = null; if (txtUser.Text.Trim() == "在此输入你的名字" || txtUser.Text.Trim() == "") { user = "我"; bs = Encoding.Unicode.GetBytes(string.Format("对方说:({0})\r\n{1}\r\n", DateTime.Now.ToString(),richTextBox2.Text.Trim())); } else { bs = Encoding.Unicode.GetBytes(string.Format("{0}说:({1})\r\n{2}\r\n", txtUser.Text.Trim(),DateTime.Now.ToString(),richTextBox2.Text.Trim())); user = txtUser.Text.Trim(); } bs = System.Text.Encoding.UTF8.GetBytes(richTextBox2.Text); //发现UTF8可支持中文,就用之 socket.BeginSend(bs, 0, bs.Length, 0, new AsyncCallback(SendCallback), socket); txt = string.Format("{0}说:({1})\r\n{2}\r\n", user, DateTime.Now.ToString(), richTextBox2.Text.Trim()); int tempLen = richTextBox1.Text.Length; richTextBox1.AppendText(txt); richTextBox1.Select(tempLen, txt.Length); richTextBox1.SelectionFont = new Font("宋体", 10); richTextBox1.SelectionColor = Color.Red; richTextBox2.Clear(); } catch(Exception ex) { MessageBox.Show("连接尚未建立!无法发送数据!" + ex.Message); } } private void getlocalip(string myip) //dw20150214 { // 获取到本机IP //自动获取到本机电脑端口 IP = IPAddress.Parse(txtIP.Text.Trim()); int point = Convert.ToInt32(txtPoint.Text.Trim()); endpoint = new IPEndPoint(IP, point); } private void Form1_Load(object sender, EventArgs e) { getlocalip(GetServerIP().ToString()); //dw20150214 //建立Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); } private void txtIP_TextChanged(object sender, EventArgs e) { } private void TheradScoket() { Thread TempThread; //开启接收线程 TempThread = new Thread(new ThreadStart(this.ToConnect)); TempThread.IsBackground = true;//设置为后台线程 TempThread.Start(); TempThread.Abort();//关闭线程 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //关闭套接字 client.Close(); } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { TheradScoket(); // socket.Close(); } } }
C# 单客户端 多服务器同时收发数据
需要用C#编写TCP协议的客户端接收两个服务器传过来的文件。使用了两个Socket连接两个服务器,每一个socket都有一个单独的接收线程recmsg,多线程+阻塞模式。 现在的问题是两个服务器有可能会在同一时刻向客户端发送文件,客户端同一IP地址下从不同端口同时接收到了文件。这种情况下是否会出现冲突的情况,客户端无法判断优先从哪个端口接收数据? 如果会有冲突,那么应该采用何种方式解决这种客户端同时接收到文件的情况? 部分代码如下 private void Form1_Load(object sender, EventArgs e) { socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.2.100"), 7890); socketClient.Connect(ipe); threadClient = new Thread(RecMsg); threadClient.IsBackground = true; threadClient.Start(); Message.AppendText("已经与服务端100建立连接,可以开始通信...\r\n"); socketClient2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe2 = new IPEndPoint(IPAddress.Parse("192.168.2.110"), 7890); socketClient2.Connect(ipe2); threadClient2 = new Thread(RecMs); threadClient2.IsBackground = true; threadClient2.Start(); Message.AppendText("已经与服务端110建立连接,可以开始通信...\r\n"); }
【新手求教】关于socket外网通信
自己写的基于socket的winform服务器和Android客户端使用TCP通信。实现后像微信朋友圈的那种。 在连入同一个局域网下客户端和服务器可以实现通信,现在我想让外网的客户端也能访问服务器。 由于本人入门没多久,查了些资料,然后准备用花生壳把我连在内网的PC做服务器,连入另一个内网的手机做客户端。花生壳给了我一个域名,我添加映射后在我的PC上添加一个IIS服务,然后别人的PC已经可以访问我的那个域名了。然后我用IP138查那个域名获得了一个IP,就把它设置成客户端要绑定的IP,但是结果客户端连不上。 又百度了一下发现众说纷纭,什么NAT打洞啦,还有说做各种没听说过的测试啦。于是头昏脑胀不知到底该怎么办了。只求有木有大侠做过类似的项目的赐教一些经验心得,本人计算机网络知识少得可怜,给个学习的方向也好,感谢在先!
用电信3g网络时tcp服务器端可以接收客户端数据,客户端却接收不到服务器端数据..?
用电信3g网络时tcp服务器端可以接收客户端数据,客户端却接收不到服务器端数据,但是局域网内可以正常双向通信,为什么?服务端用的有线公网IP,客户端用的电信cdma2000制式的3G网络,求大神解答,谢谢啦
Linux-ARM 连接网络摄像头,tcp封装http协议的问题
1.问题背景 有一块裁剪过的ARM板要用网线和网络摄像头直连,厂商只提供了CGI-API,没有其他接口,由于板子资源限制,也没法装http服务和curl。目前考虑用tcp 封装http 进行控制。 尝试过用Wireshark抓过浏览器和摄像头通信的包结构如下 ``` GET /cgi-bin/images_cgi?channel=0&user=admin&pwd=admin HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: 192.168.14.18 DNT: 1 Connection: Keep-Alive ``` 问题: 我把cookie删掉了,其余部分直接同过socket调试工具发给摄像头是有应的 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576047462_916583.png) 然后我tcp客户端也按照相同的格式send,但是始终没有收到摄像头的回应,是哪边的问题? tcp 客户端代码: ``` static protocol_err_t protocol_CameraCommand(PROTOCOL *this) { unsigned short port = 80; // 服务器的端口号 char *server_ip = "192.168.14.18"; // 服务器ip地址 int sockfd = socket(AF_INET, SOCK_STREAM, 0);// 创建TCP套接字 if(sockfd < 0) { protocol_SendString(this,"socket failed\n"); return PROTOCOL_ERR_FAIL; } struct sockaddr_in server_addr; //定义服务器信息结构体 bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &server_addr.sin_addr); int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 主动连接服务器 if(err_log != 0) { sprintf(this->sendBuffer, "connect error: %s(errno: %d)\n",strerror(errno),errno); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_FAIL; } char str1[1024] = ""; sprintf(str1, "%s\r\n","GET /cgi-bin/date_cgi?action=get&user=admin&pwd=admin HTTP/1.0"); //服务端接收数据处理文件地址,并带参数 sprintf(str1, "%s%s\r\n",str1,"Accept: text/html, application/xhtml+xml, image/jxr, */*"); sprintf(str1, "%s%s\r\n",str1,"Accept-Language: zh-CN"); sprintf(str1, "%s%s\r\n",str1,"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"); sprintf(str1, "%s%s\r\n",str1,"Accept-Encoding: gzip, deflate"); sprintf(str1, "%s%s\r\n",str1,"Host: 192.168.14.18"); //服务器地址 sprintf(str1, "%s%s\r\n",str1,"Connection: Keep-Alive"); //sprintf(str1,"%s%s\r\n",str1,"Cookie: JSESSIONID=5386A9443729D7EB0B61E38A9C7CF52F"); sprintf(str1, "%s\r\n",str1); protocol_SendString(this,"----------------------------- HTTP Data ----------------------------------\n\n"); sprintf(this->sendBuffer,"%s",str1); protocol_SendString(this, this->sendBuffer); sprintf(this->sendBuffer,"--------------------------- Data Len=%d ----------------------------------\n\n",strlen(str1)); protocol_SendString(this, this->sendBuffer); int ret=send(sockfd, str1, strlen(str1), 0); // 向服务器发送信息 if(ret<0) { protocol_SendString(this,"send"); close(sockfd); return PROTOCOL_ERR_FAIL; } protocol_SendString(this, "------------------------ server retrun data -------------------------------\n"); char recv_buf[1024*10240]=""; recv(sockfd, recv_buf, sizeof(recv_buf), 0); sprintf(this->sendBuffer,"%s\n\n",recv_buf); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_NONE; } ```
socket连接运行一段时间后无法正常通信.
小弟目前在负责一个socket相关的小项目,具体流程很简单,服务端向客户端发送数据,客户端接收到数据后进入睡眠,然后由第三方工具唤醒客户端,唤醒后服务端继续想客户端发送数据,客户端继续进入睡眠,如此一直循环. 目前小弟碰到的问题是:当循环运行到一定圈数后(有时几百圈,有时一千多圈),服务端send()方法运行过后,客户端却接收不到数据,一直阻塞在receive()方法这. 此时我用netstat -nao查看tcp连接,状态是established 还有就是服务端代码是有python写的,客户端代码是c#,我在客户端设置了socket.ReceiveTimeout(120000),当receive两分钟未收到数据,就会报异常,在catch语句里面关闭连接并重新连接;方法如下 ``` socket.shutdown(SocketShutdown.Both); socket.close(); socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint endPoint = new IPEndPoint(ip,8002); socket.Connect(endPoint); ``` 但是重新连接后依然无法接收数据,只能一直等待两分钟报错后重连,然后继续报错.但是如果我在运行正常的情况下断开WiFi然后重连,程序是可以继续运行的.. 这个问题已经困扰小弟一两个月了,希望有大佬能够帮小弟分析一下原因,万分感谢!!! 宁外,今天小弟发现服务端python代码在创建socket的时候用的是 ``` s = socket.socket() ``` 而不是 ``` s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) ``` 即未指定ipv4协议和流,不知道是不是因为这个的原因(还未验证)
VS2017,MFC,TCP通信,客户端无法连接调试助手
#1.自己所创建的客户端无法连接调试助手。 自己创建的客户端可以和自己创建的服务器端通信,调试助手连不了自己创建的服务器,自己创建的客户端也连不了调试助手。完全不知道问题出在哪了,, 两个客户端可以同时运行,端口和IP使用情况如下: ![图片说明](https://img-ask.csdn.net/upload/201901/17/1547695891_291269.png) #2.客户端核心代码如下: ##“连接”按钮的时间处理程序。 void CGeoDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 char ipaddress[35]; char port[8]; m_ipaddr.GetWindowText(ipaddress,30); cli.sin_addr.s_addr = inet_addr(ipaddress); cli.sin_family = AF_INET; cli.sin_port = m_ter.GetWindowText(port,8); //htons(5000); //创建socket clisock = socket(AF_INET, SOCK_STREAM, 0); //启动线程 ee = 1; AfxBeginThread(thread, 0); } ##线程AfxBeginThread()代码如下 UINT thread(LPVOID v) { char buff[100]; char array[25][30] = { "155.245.160.151", "155.245.160.152", "155.245.160.153", "155.245.160.154", "155.245.160.155", "155.245.160.156", "155.245.160.157", "155.245.160.158", "155.245.160.159", "155.245.160.160", "155.245.160.161", "155.245.160.162", "155.245.160.163", "155.245.160.164", "155.245.160.165", "155.245.160.166", "155.245.160.167", "155.245.160.168", "155.245.160.169", "155.245.160.170", "155.245.160.171", "155.245.160.172", "155.245.160.173", "155.245.160.174", "155.245.160.171" }; /*CSize size; size.cx = 0; size.cy = 30;*/ int s = 1, addcount = 0; CGeoDlg *dlg = (CGeoDlg*)AfxGetApp()->GetMainWnd(); dlg->m_connect.EnableWindow(FALSE); dlg->m_disconnect.EnableWindow(TRUE); //连接到服务器 while (connect(dlg->clisock, (sockaddr*)&(dlg->cli), sizeof(dlg->cli)) && dlg->ee != 0) { dlg->m_edit.SetWindowText("等待....."); //空循环 for (int i = 0; i <= 65000; i++) for (int j = 0; j <= 200; j++); if (addcount == 25) addcount = 0; dlg->cli.sin_addr.s_addr = inet_addr(array[addcount++]); } if (dlg->ee == 1) dlg->m_edit.SetWindowText( "连接成功"); //dlg->m_button1.EnableWindow(TRUE); dlg->SetForegroundWindow(); //循环获得数据 /*while (s != SOCKET_ERROR && dlg->ee != 0) { //调用recv函数接收数据 s = recv(dlg->clisock, buff, 100, 0); dlg->SetForegroundWindow(); if (s != SOCKET_ERROR && dlg->ee != 0) dlg->m_list.InsertItem(dlg->count++, buff); dlg->m_list.Scroll(size); }*/ //发送断开命令 send(dlg->clisock, "Disconnected", 100, 0); //dlg->m_button1.EnableWindow(FALSE); dlg->m_connect.EnableWindow(TRUE); dlg->m_disconnect.EnableWindow(FALSE); closesocket(dlg->clisock); AfxEndThread(0); return 0; } #3.完全不知到问题在哪 非计算机类专业,当时也没认真学,现在急着解决问题,实在不知道该怎么办了,,,
安卓APP输入的中文在传到服务端时出现个别中文乱码,请帮忙看看能否改善?谢谢~
安卓应用程序输入的中文通过Socket传到服务端时偶尔出现个别中文乱码: ���常生产,于风���,王��诚 安卓客户端代码如下: public String SendMsg(String Message) { // 检查网络 if (!CommonHelper.IsWIFIConnected(CrashHandler.getInstance().getContext())){ Toast toast = Toast.makeText(CrashHandler.getInstance().getContext(),"Wifi is NOT connected yet", Toast.LENGTH_SHORT); toast.setGravity(Gravity.BOTTOM, 0, 0); toast.show(); return ""; } String rtnMessage = ""; try { // outgoing stream redirect to socket Socket socket = new Socket(ContentFlag.SERVER_IP, ContentFlag.SERVER_PORT); OutputStream out = socket.getOutputStream(); // 注意第二个参数据为true将会自动flush,否则需要需要手动操作 out.flush(); PrintWriter output=new PrintWriter(new OutputStreamWriter(out, Charset.forName("UTF-8")), true); // 发送消息 output.println(Message); // Read from server BufferedReader input = new BufferedReader(new InputStreamReader( socket.getInputStream(), "UTF-8")); rtnMessage = input.readLine(); // close socket ; socket.close(); } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rtnMessage; } 服务端代码如下(C#): public void StartListening() { // Data buffer for incoming data. byte[] bytes = new Byte[1024]; // Establish the local endpoint for the socket. IPAddress ipAddress = IPAddress.Parse("172.22.203.100"); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, port); // Create a TCP/IP socket. Socket listener = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp ); try { listener.Bind(localEndPoint); listener.Listen(100); while (true) { try { Socket socket = listener.Accept(); new Thread(new ParameterizedThreadStart(ProcessSocket)).Start(socket); } catch { //StaticLogger.Write(e.Message.ToString(), LogLevel.L5_FAIL); } } } catch(Exception ex) { String sUnHandleMsg = "Socket Listen Error=" + ex.Message.ToString() + "IStackTrace=" + ex.StackTrace.ToString(); StaticLogger.Write(sUnHandleMsg, androidServer.Logger.LogLevel.L5_FAIL); } } public void ProcessSocket(object socket) { Socket recSocket = (Socket)socket; String data = null; byte[] bytes = null; while (true) { bytes = new byte[recSocket.Available]; try { int bytesRec = recSocket.Receive(bytes); data += Encoding.UTF8.GetString(bytes, 0, bytesRec); if (data.IndexOf("\n") > -1) { break; } } catch(Exception ee) { //通信异常,Socket被强制中断 //StaticLogger.Write(ee.Message, LogLevel.L5_FAIL); } } }
通过C++/java socket向服务器端传递字符串并接收服务器的反馈字符串与使用浏览器实现相同功能有何区别?
1.在写一个打开网络服务的软件的接口时(win10环境),用c++和java 的socket分别写了两个客户端,客户端的功能是通过端口8081向本地服务器localhost发送字符串“?scanX”,然后接收服务器的反馈“done!",但是在接收的过程中会出现网络中断,要写接口的软件报错;但如果用浏览器,直接在地址栏输入"http://127.0.0.1:8081/?scanB" ,浏览器会直接显示"done!".我想解决的是用c++写一个接口exe能及时向服务器传递字符串并接收反馈,但此时反馈出现了问题,本人小白,问了很多前辈也未能解决疑问,在此求教各位前辈,大佬。 2.以下为c++代码段,运行到"sended request success!"后网络服务器不知为何断开,要写接口的软件报错 #include <iostream> #include <windows.h> using namespace std; //在windows网络编程中需要引入库 #pragma comment(lib, "wsock32.lib") int main(int argc, char *argv[]) { //在windows网络编程中导入库,linux中不需要 WSADATA Ws; if (WSAStartup(MAKEWORD(2, 2), &Ws) != 0) { cout << "Init Windows Socket Failed::" << GetLastError() << endl; return -1; } //通过域名获取IP地址 HOSTENT *host_entry = gethostbyname("127.0.0.1"); if (!host_entry){ return -1; } //将网络字节序的网络地址转为本地字节序 char *serverIP = inet_ntoa(*((struct in_addr *)host_entry->h_addr)); cout << "server IP is " << serverIP << endl; //创建socket并且绑定了TCP协议 int hsocket = socket(AF_INET, SOCK_STREAM, 0); //socket创建失败,一般都是系统资源没有了,或者没有权限 if (hsocket == INVALID_SOCKET) *** { cout << "Create Socket Failed::" << GetLastError() << endl; return -2; } //连接http服务器 sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(8081); //指定端口号 servAddr.sin_addr.S_un.S_addr = inet_addr(serverIP); if (connect(hsocket, (struct sockaddr*)&servAddr, sizeof(servAddr)) == -1) { cout << "Connect error" << endl; return -3; } else cout << "Connected "<<serverIP<<" successed!" << endl; //发出页面URL请求数据 char req[] = "?connect0"; //注意send并不能保证你指定大小的数据它能够全部发送, if (send(hsocket, req, (int)strlen(req), 0) < 0) { cout << "send request error" << endl; return -4; } cout << "sended request success!" << endl; //接收数据的缓冲,应为是字符串所以结尾要加\0,我们一开始就将它全部置0 char buffer[10000] = {0}; int len; if ( recv(hsocket, buffer, sizeof(buffer)-1, 0) <0) { cout << "read error" << endl; exit(1); } cout << buffer << endl; getchar(); return 0; } ``` ``` 这是运行结果 ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553395763_716349.png) 软件报错(查百度说这句话是因为读取软件数据导致的,不知正确与否) ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553395434_777007.png) 对比使用浏览器通信,能直接收到反馈 ![图片说明](https://img-ask.csdn.net/upload/201903/24/1553395626_39803.png)
为什么在MFC中使用线程会出现程序崩溃?是我实用的方法不敌还是怎么回事?
在使用MFC中使用的线程是 API函数,调用CreateThread(); 可是使用的时候调试一步一步走都是正常的,但是一起运行就发现程序崩溃。我是一个初学的菜鸟,可能是代码有点乱,麻烦看一下!!! 谢谢各位大佬: ``` // UDPserver.cpp : 实现文件 // #include "stdafx.h" #include "ServerUDP.h" #include "UDPserver.h" #include <Winsock2.h>//加裁头文件 #include <stdio.h>//加载标准输入输出头文件 #define IDP_SOCKETS_INIT_FAILED 103 SOCKET m_revSocket; // CUDPserver CUDPserver::CUDPserver() { } CUDPserver::~CUDPserver() { } // CUDPserver 成员函数 // Server 成员函数 bool CUDPserver::Socket()//初始化 { //初始化Winscok if (!AfxSocketInit()) { AfxMessageBox(IDP_SOCKETS_INIT_FAILED); return 1; } // SetSockOpt(); WORD wVersionRequested;//版本号 WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字 err = WSAStartup( wVersionRequested, &wsaData ); if ( err != 0 ) { return false; }//加载套接字库,加裁失败则返回 if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) { WSACleanup( ); return false; }//如果不是1.1的则退出 return true; } #include"Set_up.h" CSet_up up; bool CUDPserver::GetLocalAddress(){ CString strAddress; int nCardNo = 1; //PIP_ADAPTER_INFO结构体指针存储本机网卡信息 PIP_ADAPTER_INFO pIpAdapterInfo = new IP_ADAPTER_INFO(); //得到结构体大小,用于GetAdaptersInfo参数 unsigned long stSize = sizeof(IP_ADAPTER_INFO); //调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量 int nRel = GetAdaptersInfo(pIpAdapterInfo,&stSize); //记录网卡数量 int netCardNum = 0; //记录每张网卡上的IP地址数量 int IPnumPerNetCard = 0; if (ERROR_BUFFER_OVERFLOW == nRel) { //如果函数返回的是ERROR_BUFFER_OVERFLOW //则说明GetAdaptersInfo参数传递的内存空间不够,同时其传出stSize,表示需要的空间大小 //这也是说明为什么stSize既是一个输入量也是一个输出量 //释放原来的内存空间 delete pIpAdapterInfo; //重新申请内存空间用来存储所有网卡信息 pIpAdapterInfo = (PIP_ADAPTER_INFO)new BYTE[stSize]; //再次调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量 nRel=GetAdaptersInfo(pIpAdapterInfo,&stSize); } if (ERROR_SUCCESS == nRel) { //输出网卡信息 //可能有多网卡,因此通过循环去判断 while (pIpAdapterInfo) { //可能网卡有多IP,因此通过循环去判断 IP_ADDR_STRING *pIpAddrString =&(pIpAdapterInfo->IpAddressList); switch(pIpAdapterInfo->Type) { case MIB_IF_TYPE_OTHER: case MIB_IF_TYPE_ETHERNET: case MIB_IF_TYPE_TOKENRING: case MIB_IF_TYPE_FDDI: case MIB_IF_TYPE_PPP: case MIB_IF_TYPE_LOOPBACK: case MIB_IF_TYPE_SLIP: { strAddress = pIpAddrString->IpAddress.String; // 需要注意的是有时可能获取的IP地址是0.0.0.0,这时需要过滤掉 if(CString("0.0.0.0")==strAddress) break; // std::cout<<_T("第")<< nCardNo<<_T("张网卡的IP地址是")<< strAddress<<std::endl; // long PID = _ttol(strAddress); //CString 转成 char*,该语句缺一不 // mxcj.m_strIP = (DWORD)PID; // 再强制转换成DWORD m_DIP= strAddress; nCardNo++; break; } default: // 未知类型网卡就跳出 break; } pIpAdapterInfo = pIpAdapterInfo->Next; } } //释放内存空间 if (pIpAdapterInfo) { delete pIpAdapterInfo; } //initsocket();//创建套接字 return true; } bool CUDPserver::initsocket() { /*创建套接字*/ //AF_INET表示IPv4,SOCK_STREAM数据传输方式,IPPROTO_TCP传输协议; m_listenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (m_listenSocket == INVALID_SOCKET) { //printf("套接字创建失败"); WSACleanup(); return 0; } Bind(); return true; } bool CUDPserver::Bind()// 绑定地址端口 { sockaddr_in addrListen; addrListen.sin_family = AF_INET; //指定IP格式 addrListen.sin_port = htons(m_iDKH); //绑定端口号 addrListen.sin_addr.S_un.S_addr = INADDR_ANY; //表示任何IP service.sin_addr.s_addr = inet_addr("127.0.0.1"); if (bind(m_listenSocket, (SOCKADDR*)&addrListen, sizeof(addrListen)) == SOCKET_ERROR) //(SOCKADDR*) { //printf("绑定失败"); closesocket(m_listenSocket); return 0; } Connect(); //连接开始监听 return true; } unsigned int WINAPI ThreadProFunc(void *pParam); bool CUDPserver::Connect() //连接 { /*开始监听*/ if (listen(m_listenSocket, 5) == SOCKET_ERROR) { //printf("监听出错"); closesocket(m_listenSocket); return 0; } /*等待连接,连接后建立一个新的套接字*/ //SOCKET revSocket; //对应此时所建立连接的套接字的句柄 //HANDLE hThread; // DWORD dwThreadId; //sockaddr_in remoteAddr; //接收连接到服务器上的地址信息 //int remoteAddrLen = sizeof(remoteAddr); //printf("等待连接...\n"); /*等待客户端请求,服务器接收请求*/ //m_revSocket = accept(m_listenSocket, (SOCKADDR*)&remoteAddr, &remoteAddrLen); //等待客户端接入,直到有客户端连接上来为止 /*if (m_revSocket == INVALID_SOCKET) { closesocket(m_listenSocket); WSACleanup(); return 0; } else { /* 启动等待连接线程 */ HANDLE acceptThread = CreateThread(NULL, 0, WaitAcceptThread, (LPVOID)m_listenSocket, 0, NULL); WaitForSingleObject(acceptThread, INFINITE); // 等待线程结束 // return 0; //} return true; } unsigned int WINAPI ThreadProFunc(void *pParam) { CUDPserver server; server.Receive(); char revData[255] = ""; while(1){ /*通过建立的连接进行通信*/ int res = recv(server.m_revSocket, revData, 255, 0); if (res > 0) { //printf("Bytes received: %d\n", res); // server.m_wndOutputBuild.AddString(_T("调试输出正显示在此处。")); //printf("客户端发送的数据: %s\n", revData); return 0; } //sleep(1000); return 0; } } UINT __cdecl CUDPserver::hellothread(LPVOID lparam){ CUDPserver server; server.Receive(); char revData[255] = ""; while(1){ /*通过建立的连接进行通信*/ int res = recv(server.m_revSocket, revData, 255, 0); if (res > 0) { //printf("Bytes received: %d\n", res); // server.m_wndOutputBuild.AddString(_T("调试输出正显示在此处。")); //printf("客户端发送的数据: %s\n", revData); return 0; } //sleep(1000); return 0; } } HANDLE bufferMutex; DWORD WINAPI WaitAcceptThread(LPVOID IpParameter) { SOCKET m_socket = (SOCKET)IpParameter; // int rval; sockaddr_in remoteAddr; //接收连接到服务器上的地址信息 int remoteAddrLen = sizeof(remoteAddr); while(true){ /*等待客户端请求,服务器接收请求*/ m_revSocket = accept(m_socket, (SOCKADDR*)&remoteAddr, &remoteAddrLen); //等待客户端接入,直到有客户端连接上来为止 if (m_revSocket == INVALID_SOCKET) { //printf("客户端发出请求,服务器接收请求失败:\n",WSAGetLastError()); closesocket(m_revSocket); WSACleanup(); return 0; } HANDLE receiveThread = CreateThread(NULL, 0, RecMsgThread, (LPVOID)m_revSocket, 0, NULL); WaitForSingleObject(bufferMutex, INFINITE); if(NULL == receiveThread) { //printf("\nCreatThread AnswerThread() failed.\n"); return 0; } ReleaseSemaphore(bufferMutex, 1, NULL); } } DWORD WINAPI RecMsgThread(LPVOID IpParameter) { SOCKET ClientSocket=(SOCKET)(LPVOID)IpParameter; int rval; while(1) { char recvBuf[1024]; rval = recv(ClientSocket, recvBuf, 1024, 0); WaitForSingleObject(bufferMutex, INFINITE); if (rval == SOCKET_ERROR) { // printf("ONE Client Exit\n"); // vector<SOCKET>::iterator result = find(clientSocketGroup.begin(), clientSocketGroup.end(), ClientSocket); // clientSocketGroup.erase(result); // for (map<SOCKET, string>::iterator i=m_ipSocket.begin(); i!=m_ipSocket.end(); i++) // { // if (i->first == ClientSocket) // { // printf("%s下线\n",m_ipSocket[ClientSocket].c_str()); // m_ipSocket.erase(i); // break; // } // } closesocket(ClientSocket); ReleaseSemaphore(bufferMutex, 1, NULL); break; } recvBuf; if(recvBuf[0] == -113){ if(recvBuf[0]== -1){ return 0; } } // printf("%s Says: %s\n", m_ipSocket[ClientSocket].c_str(), recvBuf); // 接收信息 Sleep(1000); ReleaseSemaphore(bufferMutex, 1, NULL); } return 0; } ```
android模拟器与pc的相互通信
我现在再能实现模拟器联系pc,pc作为服务器被动的做出反应。不能实现pc发消息给模拟器。那要如何实现相互的通信呢 代码如下: ``` package com.example.socket_android; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import android.annotation.SuppressLint; import android.app.Activity; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; /** * 测试Android客户端与PC服务器通过socket进行交互 * 客户端:把用户输入的信息发送给服务器 * @author Ameyume * */ public class MainActivity extends Activity { private static final String TAG = "Socket_Android"; private EditText mEditText = null; private TextView tx1 = null; private Button mButton = null; @SuppressLint("NewApi") @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //强制占用ui if (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } mButton = (Button)findViewById(R.id.button1); mEditText=(EditText)findViewById(R.id.editText1); //mEditText = (EditText)findViewById(R.id.editText1); tx1 = (TextView)findViewById(R.id.textView1); mButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub setTitle("测试Socket连接"); Socket socket = null; try { /* 指定Server的IP地址,此地址为局域网地址,如果是使用WIFI上网,则为PC机的WIFI IP地址 * 在ipconfig查看到的IP地址如下: * Ethernet adapter 无线网络连接: * Connection-specific DNS Suffix . : IP Address. . . . . . . . . . . . : 192.168.1.100 */ InetAddress serverAddr = InetAddress.getByName("192.168.1.225");// TCPServer.SERVERIP Log.d("TCP", "C: Connecting..."); // 应用Server的IP和端口建立Socket对象 socket = new Socket(serverAddr, 51706); String message = "---Test_Socket_Android---"; Log.d("TCP", "C: Sending: '" + message + "'"); // 将信息通过这个对象来发送给Server PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())), true); // 把用户输入的内容发送给server String toServer = mEditText.getText().toString(); Log.d(TAG, "To server:'" + toServer + "'"); out.println(toServer); out.flush(); // 接收服务器信息 BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); // 得到服务器信息 String msg = in.readLine(); Log.d(TAG, "From server:'" + msg + "'"); // 在页面上进行显示 tx1.setText(msg); } catch(UnknownHostException e) { //Log.e(TAG, "192.168.1.100 is unkown server!"); Log.e(TAG, "192.168.1.225 is unkown server!"); } catch(Exception e) { e.printStackTrace(); } finally { try { socket.close(); } catch(Exception e) { e.printStackTrace(); } } } }); } } ``` ``` <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:background="#aacccc" tools:context="com.example.socket_android.MainActivity" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView4" android:layout_marginTop="40dp" android:layout_toRightOf="@+id/textView4" android:background="#aaccff" android:text="发送" /> <TextView android:id="@+id/textView1" android:background="#aaccff" android:layout_width="match_parent" android:layout_height="20dp" android:layout_alignLeft="@+id/textView4" android:layout_below="@+id/textView4" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginTop="28dp" android:text="@string/hello_world" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="20dp" android:layout_alignRight="@+id/textView2" android:layout_below="@+id/textView2" android:layout_marginRight="22dp" android:layout_marginTop="74dp" android:gravity="center" android:text="指令" /> <TextView android:id="@+id/textView4" android:layout_width="60dp" android:layout_height="20dp" android:layout_alignLeft="@+id/textView3" android:layout_below="@+id/textView3" android:layout_marginTop="25dp" android:text="返回结果:" /> <EditText android:id="@+id/editText1" android:background="#aaccff" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBaseline="@+id/textView3" android:layout_alignBottom="@+id/textView3" android:layout_alignRight="@+id/textView1" android:layout_toRightOf="@+id/textView4" android:ems="10" /> </RelativeLayout> ``` ``` //package Project1; ///** // * Class1 的摘要说明。 // */ //public class Class1 //{ // public Class1() // { // // // // TODO: 在此处添加构造函数逻辑 // // // } //} import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 测试Android客户端与PC服务器通过socket进行交互 * 服务器端:接收客户端的信息并回送给客户 * @author Ameyume * */ public class Server implements Runnable { //public static final String SERVERIP = "192.168.1.100"; public static final String SERVERIP = "192.168.1.225"; public static final int SERVERPORT = 51706; public void run() { try { System.out.println("S: Connecting..."); ServerSocket serverSocket = new ServerSocket(SERVERPORT); while (true) { // 等待接受客户端请求 Socket client = serverSocket.accept(); System.out.println("S: Receiving..."); try { // 接受客户端信息 BufferedReader in = new BufferedReader( new InputStreamReader(client.getInputStream())); // 发送给客户端的消息 PrintWriter out = new PrintWriter(new BufferedWriter( new OutputStreamWriter(client.getOutputStream())), true); System.out.println("S: 111111"); String str = in.readLine(); // 读取客户端的信息 int j; if (str.equals("a")) { j = 1; } else if (str.equals("b")) { j = 2; } else if(str.equals ("1")) { j = 3; } else { j=4; } switch (j) { case 1: str = "a1"; break; case 2: str = "a2"; break; case 3: str = "a3"; break; case 4: str = "a4"; break; case 5: str = "a5"; break; case 6: str = "a6"; break; } System.out.println("S: 222222"); if (str != null) { // 设置返回信息,把从客户端接收的信息再返回给客户端 out.println("You sent to server message is:" + str); out.flush(); // 把客户端发送的信息保存到文件中 File file = new File("C://android.txt"); FileOutputStream fops = new FileOutputStream(file); byte[] b = str.getBytes(); for (int i = 0; i < b.length; i++) { fops.write(b[i]); } System.out.println("S: Received: '" + str + "'"); } else { System.out.println("Not receiver anything from client!"); } } catch (Exception e) { System.out.println("S: Error 1"); e.printStackTrace(); } finally { client.close(); System.out.println("S: Done."); } } } catch (Exception e) { System.out.println("S: Error 2"); e.printStackTrace(); } } public static void main(String[] args) { Thread desktopServerThread = new Thread(new Server()); desktopServerThread.start(); } } ```
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
五年程序员记流水账式的自白。
不知觉已中码龄已突破五年,一路走来从起初铁憨憨到现在的十九线程序员,一路成长,虽然不能成为高工,但是也能挡下一面,从15年很火的android开始入坑,走过java、.Net、QT,目前仍处于android和.net交替开发中。 毕业到现在一共就职过两家公司,目前是第二家,公司算是半个创业公司,所以基本上都会身兼多职。比如不光要写代码,还要写软著、软著评测、线上线下客户对接需求收集...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
一文详尽系列之模型评估指标
点击上方“Datawhale”,选择“星标”公众号第一时间获取价值内容在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
压测学习总结(1)——高并发性能指标:QPS、TPS、RT、吞吐量详解
一、QPS,每秒查询 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。互联网中,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。 二、TPS,每秒事务 TPS:是TransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
还记得那个提速8倍的IDEA插件吗?VS Code版本也发布啦!!
去年,阿里云发布了本地 IDE 插件 Cloud Toolkit,仅 IntelliJ IDEA 一个平台,就有 15 万以上的开发者进行了下载,体验了一键部署带来的开发便利。时隔一年的今天,阿里云正式发布了 Visual Studio Code 版本,全面覆盖前端开发者,帮助前端实现一键打包部署,让开发提速 8 倍。 VSCode 版本的插件,目前能做到什么? 安装插件之后,开发者可以立即体验...
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
2019年除夕夜的有感而发
天气:小雨(加小雪) 温度:3摄氏度 空气:严重污染(399) 风向:北风 风力:微风 现在是除夕夜晚上十点钟,再有两个小时就要新的一年了; 首先要说的是我没患病,至少现在是没有患病;但是心情确像患了病一样沉重; 现在这个时刻应该大部分家庭都在看春晚吧,或许一家人团团圆圆的坐在一起,或许因为某些特殊原因而不能团圆;但不管是身在何处,身处什么境地,我都想对每一个人说一句:新年快乐! 不知道csdn这...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
相关热词 c#导入fbx c#中屏蔽键盘某个键 c#正态概率密度 c#和数据库登陆界面设计 c# 高斯消去法 c# codedom c#读取cad文件文本 c# 控制全局鼠标移动 c# temp 目录 bytes初始化 c#
立即提问