socket编程实例一个简单的面向socket实例,错在哪里?
socket编程实例 时间:2021-06-09 阅读:(
)
如何进行 Socket 编程
Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上的数据的传递。
在java中,有专门的socket类来处理用户的请求和响应。
利用SOCKET类的方法,就可以实现两台计算机之间的通讯。
这里就介绍一下在JAVA中如何利用socket进行网络编程。
在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。
getInputStream方法可以得到一个输入流,客户端的Socket对象上的getInputStream方法得到的输入流其实就是从服务器端发回的数据流。
GetOutputStream方法得到一个输出流,客户端Socket对象上的getOutputStream方法返回的输出流就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。
程序可以对这些数据流根据需要进行进一步的封装。
本文的例子就对这些数据流进行了一定的封装(关于封装可以参考Java中流的实现部分)。
一、建立服务器类 Java中有一个专门用来建立Socket服务器的类,名叫ServerSocket,可以用服务器需要使用的端口号作为参数来创建服务器对象。
ServerSocket server = new ServerSocket(9998) 这条语句创建了一个服务器对象,这个服务器使用9998号端口。
当一个客户端程序建立一个Socket连接,所连接的端口号为9998时,服务器对象server便响应这个连接,并且ept()方法会创建一个Socket对象。
服务器端便可以利用这个Socket对象与客户进行通讯。
Socket ing = ept() 进而得到输入流和输出流,并进行封装BufferedReader in = new BufferedReader(new InputStreamReader(ing.getInputStream())); PrintWriter out = new PrintWriter(ing.getOutputStream(),true); 随后,就可以使用in.readLine()方法得到客户端的输入,也可以使用out.println()方法向客户端发送数据。
从而可以根据程序的需要对客户端的不同请求进行回应。
关于VC++ socket如何实现聊天全双工
你这个程序采用udp发送/接收数据,并且使用了阻塞方式的Socket,这样在读数据时会一直等到读到数据后才能执行后面的步骤,写数据时也会等到将全部数据写完才执行后面的步骤。
修改这个程序首先要将创建的Socket改成异步读写的形式,然后使用select函数判断socket是否有数据可读和可以发送数据,并且udp发送的数据包不能过大,一包数据以不超过1392字节为宜。
一个简单的面向socket实例,错在哪里?
问题不少,看一下我修改后的代码,另外在exit前,应该把所有的socket都关闭,虽然默认的系统会在程序退出时自动帮你关掉,但这是一个好的编程习惯,应该自己在程序里关。
#include <sys/types.h>
#include <sys/socket.h>
#include &/in.h>
#include <arpa/.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define PORT 6677
#define MAXCLIENT 3
int main(int argc,char* argv[])
{
int serSock, newConnSock;
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
char msg[] = "e from the server";
int connectedClient[MAXCLIENT], cli;
for(cli = 0;cli<MAXCLIENT;cli++)
{
connectedClient[cli]=0;
}
serSock = socket(AF_INET, SOCK_STREAM, 0);
if(serSock<0)
{
perror("socket");
exit(1);
}
else
{
printf("socket created
");
printf("socketd id: %d
",serSock);
}
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(serSock, (struct sockaddr*)&addr, sizeof(addr))<0)
{
perror("connect");
exit(1);
}
else
{
printf("connected.
");
printf("local port: %d
", PORT);
}
if (listen(serSock, 3)<0)
{
perror("listen");
exit(1);
}
else
{
printf("listening......
");
}
for (cli=0;cli<MAXCLIENT;cli++)
{
connectedClient[cli] = 0;
}
cli = 0;
while(1)
{
newConnSock=ept(serSock, (struct sockaddr*)&addr, &addr_len);
if (cli >= MAXCLIENT)
{
printf("socket reach maxsize %d, server ped, current socket %d:
", MAXCLIENT, cli);
/* Should close newConnSock and connectedClient[]
* before exiting
*/
exit(0);
}
if (newConnSock <= 0)
{
perror("ept");
}
else
{
connectedClient[cli] = newConnSock;
write(connectedClient[cli],msg,sizeof(msg));
printf("connected from %s
", _ntoa(addr.sin_addr));
printf("current socket: %d
",connectedClient[cli]);
cli++;
}
printf("running for another loop...
");
}
}
数脉科技怎么样?昨天看到数脉科技发布了7月优惠,如果你想购买香港服务器,可以看看他家的产品,性价比还是非常高的。数脉科技对香港自营机房的香港服务器进行超低价促销,可选择10M、30M的优质bgp网络。目前商家有优质BGP、CN2、阿里云线路,国内用户用来做站非常不错,目前E3/16GB阿里云CN2线路的套餐有一个立减400元的优惠,有需要的朋友可以看看。点击进入:数脉科技商家官方网站香港特价阿里云...
rfchost怎么样?rfchost是一家开办了近六年的国人主机商,一般能挺过三年的国人商家,还是值得入手的,商家主要销售VPS,机房有美国洛杉矶/堪萨斯、中国香港,三年前本站分享过他家堪萨斯机房的套餐。目前rfchost商家的洛杉矶机房还是非常不错的,采用CN2优化线路,电信双程CN2 GIA,联通去程CN2 GIA,回程AS4837,移动走自己的直连线路,目前季付套餐还是比较划算的,有需要的可...
spinservers美国圣何塞机房的独立服务器补货120台,默认接入10Gbps带宽,给你超高配置,这价格目前来看好像真的是无敌手,而且可以做到下单后30分钟内交货,都是预先部署好了的。每一台机器用户都可以在后台自行安装、重装、重启、关机操作,无需人工参与! 官方网站:https://www.spinservers.com 比特币、信用卡、PayPal、支付宝、webmoney、Payssi...
socket编程实例为你推荐
excel计算公式求excel函数公式大全performclickVB.net 窗体3里面的单击事件在窗体1中怎么调用awvAWV的转换器 要免费的 看好是AWV不是AMV防火墙排名什么防火墙世界第一啊?(急!!!)印度尼西亚国家代码印尼身份证号的编码规则是什么?(比如中国的1-6位是地址代码,7-14位是出生日期码等)什么是生态系统生态系统的功能有什么?activitygroupactivityGroup子activity跳转的问题收费视频怎么制作收费视频微粒群算法多目标粒子群算法源程序翻译图片识别有那种根据图片识别上面的英文进行翻译的软件么?
godaddy域名解析 免费域名跳转 hostgator webhosting 128m内存 韩国电信 gitcafe 申请个人网页 魔兽世界台湾服务器 创梦 架设服务器 工信部icp备案号 重庆双线服务器托管 申请网页 万网空间购买 双线机房 免费asp空间 日本代理ip 阿里云邮箱申请 重庆联通服务器托管 更多