socket编程总结
近来学习网络游戏开发,用到socket编程。
socket 编程跟 http编程差不多,一般过程都是建立链接,打开输入或输出流,通过流输入输出资源。
不同之处:
http编程,需要确认其连接状态码,由http协议给出,只有双方,确认好,才能建立链接。
socket则不需要。socket 打开时,需要指定网络端口,端口随便给出,主要保持c/s双方一致即可。
一般是8070,8070由tomact指定。还有,socket中,输入资源方,需要将资源的大小写入流中,以便接受方读取该长度,构造数组。
socket编程分为客户端和服务器端。
客户端:
SocketConnection conn;
byte[] readBuffer;
readBuffer = new byte[4];
try
{
conn=(SocketConnection)Connector.open("socket://localhost:8070");
DataInputStream in = conn.openDataInputStream();
int imageSize = in.readInt();
readBuffer = new byte[imageSize];
in.read(readBuffer,0,imageSize);
Image image = Image.createImage(readBuffer,0,readBuffer.length);//通过字节数组,构造图片
this.append(image); //显示图片
}
catch(Exception e)
{
System.out.print(e);
}
服务器:
ServerSocketConnection server;
SocketConnection client;
byte []writeBuffer;
try
{
server=(ServerSocketConnection)Connector.open("socket://:8070");
client=(SocketConnection)server.acceptAndOpen();
client.setSocketOption(SocketConnection.DELAY,0); //是否开启Nagle算法
client.setSocketOption(SocketConnection.LINGER,5); //设置服务器的悬挂等待时间
client.setSocketOption(SocketConnection.KEEPALIVE,0);
client.setSocketOption(SocketConnection.RCVBUF,1024); //设置接收缓冲
client.setSocketOption(SocketConnection.SNDBUF,1024); //设置发送缓冲
OutputStream os=client.openOutputStream();
InputStream imageIn=getClass().getResourceAsStream("/img/index_logo.png");//利用资源构造输入流
int imageSize = imageIn.available();//资源长度
byte[]imageBuffer = new byte[imageSize];
imageIn.read(imageBuffer,0,imageSize);
ByteArrayOutputStream bos=new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeInt(imageSize);
dos.flush();
writeBuffer = bos.toByteArray();//bos 仅仅是将资源长度写入流
os.write(writeBuffer,0,writeBuffer.length);
os.write(imageBuffer,0,imageSize);
os.flush();
}
catch(Exception e)
{
System.out.print(e);
}