吴磊越狱初中生跆拳道露腹肌肌是什么情况?

java socket实现两个客户段或多个客户端之间通信,该怎么解决 - J2SE当前位置:& &&&java socket实现两个客户段或多个客户端之间通信,该java socket实现两个客户段或多个客户端之间通信,该怎么解决&&网友分享于:&&浏览:832次java socket实现两个客户段或多个客户端之间通信java socket实现两个客户段或多个客户端之间通信。大家能够给我一个详细的讲解吗?------解决方案--------------------引用楼主 JAVALover 的帖子:java socket实现两个客户段或多个客户端之间通信。大家能够给我一个详细的讲解吗?
------解决方案--------------------首先有两个类一个是客户端,,一个是服务端,客户端连接到指定IP的服务器的端口,,服务器监听该端口 ,,,然后就输入输出流,,服务器端要用非阻塞式实现多个用户同时连接
------解决方案--------------------
//&&think in java &&的一章1 5 . 2 . 1 一个简单的服务器和客户机程序这个例子将以最简单的方式运用套接字对服务器和客户机进行操作。服务器的全部工作就是等候建立一个连接,然后用那个连接产生的Socket 创建一个InputStream 以及一个OutputStream。在这之后,它从InputStream 读入的所有东西都会反馈给OutputStream,直到接收到行中止(END)为止,最后关闭连接。客户机连接与服务器的连接,然后创建一个OutputStream。文本行通过OutputStream 发送。客户机也会创建一个InputStream,用它收听服务器说些什么(本例只不过是反馈回来的同样的字句)。服务器与客户机(程序)都使用同样的端口号,而且客户机利用本地主机地址连接位于同一台机器中的服务540器(程序),所以不必在一个物理性的网络里完成测试(在某些配置环境中,可能需要同真正的网络建立连接,否则程序不能工作——尽管实际并不通过那个网络通信)。下面是服务器程序://: JabberServer.java// Very simple server that just// echoes whatever the client sends.import java.io.*;import java.net.*;public class JabberServer {// Choose a port outside of the range 1-1024:public static final int PORT = 8080;public static void main(String[] args)throws
{ServerSocket s = new ServerSocket(PORT);System.out.println(&Started: & + s);try {// Blocks until a connection occurs:Socket socket = s.accept();try {System.out.println(&Connection accepted: &+ socket);BufferedReader in =new BufferedReader(new InputStreamReader(socket.getInputStream()));// Output is automatically flushed// by PrintWriter:PrintWriter out =new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);while (true) {String str = in.readLine();if (str.equals(&END&))System.out.println(&Echoing: & + str);out.println(str);}// Always close the two sockets...} finally {System.out.println(&closing...&);socket.close();}} finally {s.close();}}} ///:~可以看到,ServerSocket 需要的只是一个端口编号,不需要IP 地址(因为它就在这台机器上运行)。调用541accept()时,方法会暂时陷入停顿状态(堵塞),直到某个客户尝试同它建立连接。换言之,尽管它在那里等候连接,但其他进程仍能正常运行(参考第14 章)。建好一个连接以后,accept()就会返回一个Socket对象,它是那个连接的代表。清除套接字的责任在这里得到了很艺术的处理。假如ServerSocket 构建器失败,则程序简单地退出(注意必须保证ServerSocket 的构建器在失败之后不会留下任何打开的网络套接字)。针对这种情况,main()会“掷”出一个IOException 违例,所以不必使用一个try 块。若ServerSocket 构建器成功执行,则其他所有方法调用都必须到一个try-finally 代码块里寻求保护,以确保无论块以什么方式留下,ServerSocket 都能正确地关闭。同样的道理也适用于由accept()返回的Socket。若accept() 失败,那么我们必须保证Socket 不再存在或者含有任何资源,以便不必清除它们。但假若执行成功,则后续的语句必须进入一个try-finally 块内,以保障在它们失败的情况下,Socket 仍能得到正确的清除。由于套接字使用了重要的非内存资源,所以在这里必须特别谨慎,必须自己动手将它们清除(Java 中没有提供“破坏器”来帮助我们做这件事情)。无论ServerSocket 还是由accept()产生的Socket 都打印到System.out 里。这意味着它们的toString方法会得到自动调用。这样便产生了:ServerSocket[addr=0.0.0.0,PORT=0,localport=8080]Socket[addr=127.0.0.1,PORT=1077,localport=8080]大家不久就会看到它们如何与客户程序做的事情配合。程序的下一部分看来似乎仅仅是打开文件,以便读取和写入,只是InputStream 和OutputStream 是从Socket 对象创建的。利用两个“转换器”类InputStreamReader 和OutputStreamWriter ,InputStream 和OutputStream 对象已经分别转换成为Java 1.1 的Reader 和Writer 对象。也可以直接使用Java1.0 的InputStream 和OutputStream 类,但对输出来说,使用Writer 方式具有明显的优势。这一优势是通过PrintWriter 表现出来的,它有一个过载的构建器,能获取第二个参数——一个布尔值标志,指向是否在每一次println()结束的时候自动刷新输出(但不适用于print()语句)。每次写入了输出内容后(写进out),它的缓冲区必须刷新,使信息能正式通过网络传递出去。对目前这个例子来说,刷新显得尤为重要,因为客户和服务器在采取下一步操作之前都要等待一行文本内容的到达。若刷新没有发生,那么信息不会进入网络,除非缓冲区满(溢出),这会为本例带来许多问题。编写网络应用程序时,需要特别注意自动刷新机制的使用。每次刷新缓冲区时,必须创建和发出一个数据包(数据封)。就目前的情况来说,这正是我们所希望的,因为假如包内包含了还没有发出的文本行,服务器和客户机之间的相互“握手”就会停止。换句话说,一行的末尾就是一条消息的末尾。但在其他许多情况下,消息并不是用行分隔的,所以不如不用自动刷新机制,而用内建的缓冲区判决机制来决定何时发送一个 共&5&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有11552人阅读
Java AND Android(58)
http://blog.csdn.net/hslinux/article/details/6214594
之间进行通讯要点简要解析
1、与little-endian
&&&Endian定义:
big-endian也称高位在前、大端在前。是)存放在最低端的地址&上。采用这种机制的处理器有&PowerPC处理器。
big-endian&最直观的字节序:
内存地址从左到右与值由低到高的顺序相对应。
little-endian也称低位在前、小端在前。)存放在最低端的地&址上。采用这种机制的处理器有&x86,这里仅讨论多字节存储循序
little-endian是最符合人的思维的字节序,低与低,高与高一一对应:
地址低位存储值的低位&
地址高位存储值的高位
&&&&&下面举一个例子具体说明big-endian与little-endian:
&&&&&&int&&nValue&=&0x;
&&&&&&上面的整型有个字节,其中为最高位的字节,为最低位的字节。那么在内存(或文件)中,该值的存储循序为:
&&&&&&内存(或文件)地址:
&&&&&&Big-endian&&&&&&&&&:&&&&&
&&&&&&Little-endian&&&&&&&&:&&&&&
&&&&&&如果用一个数组来保存的话,也就是如下:
&&&&&&Big-endian模式下:&
&&&&&&Little-endian模式下:
Big-endian或是little-endian的判断:
2、网络字节序与主机字节序
译码从而导致通信失败。
通常所说的网络字节序()就是遵循规则。实际通信过程中,通信双方需要把数据按照编码再通过网络传输。
通常所说的主机字节序(),与的字节序一致。系列主机的字节序都是桂册。所有规则主机直接通过网络通讯的时候,需要进行字节序转化。
&&&&为了进行转换&提供了转换的函数&有下面四个
&htons&把类型从主机字节序转换到网络字节序
&htonl&把类型从主机字节序转换到网络字节序
&ntohs&把类型从网络字节序转换到主机字节序
&&&&&ntohl&把类型从网络字节序转换到主机字节序
&&&&在使用的系统中这些函数会把字节序进行转换
&&&&在使用类型的系统中这些函数会定义成空宏
由于运行需要自己的虚拟机来支持,所以程序所支持的字节序与虚拟机一致。虚拟机遵循的是规则。所以可以把字节序看作是遵循规则的主机字节序。
4、程序与之间的通讯
4.1&字节序问题
一直以来都在进行着上面的网络开发,发现在上面进行通讯的时候,基本上都没有考虑到网络字节序的问题,特别是网络应用中的用户数据。大家都知道网络通讯传输的都是字节流的数据,于是都是定义一个类型的缓冲区,然后不管,还是其他自定义类型的结构对象也好,都直接拷贝到缓冲区,直接发送出去了,根本都没有考虑所传输数据的网络字节序问题。如果非要说一点关注了网络字节序问题的话,那就是有一个地方,大家都回去用到的,也就是网络通讯端口,把端口号赋值给.sin_port之时大家都会使用了,也就是把端口号从主机字节序转化为网络字节序。
因为这些程序的服务器端也好,客户端也好,都是在系列系统下运行,并且都是编译出来的,所以不会因为字节序而出现问题。
现在所做项目,涉及到与之间的通讯,这样的情况下,就需要大家都按规则来办事了,方面传输的多字节类型数据还请从主机字节序转化成网络字节序再进行传输。
当然,数据是由程序员来组合的,也是由程序员来解析的,所以如果不按标准行事也是可以的。但是就需要在解析数据的时候注意好了。
建议还是按标准行事,把数据转化成网络字节序。
&&&&&Java与平台下其他开发语言之间进行数据交与,也需要遵循该原则;
&&&&&Java下读写平台下其他开发语言保存的数据,或是平台下其他语言读写保存的数据,也需要注意字节序问题。
4.2&字节对齐问题
上面的程序在WinXP&sp3&+&VS2008Sp1下运行结果如下:
sizeof(S1):9
sizeof(S2):20
sizeof(S3):8
sizeof(S4):5
请按任意键继续
Win32位平台下的微软编译器的对齐策略:
1)&结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
备注:编译器在给结构体开辟空间时,首先找到结构体中最宽的基本数据类型,然后寻找内存地址能被该基本数据类型所整除的位置,作为结构体的首地址。将这个最宽的基本数据类型的大小作为上面介绍的对齐模数。
2)&结构体每个成员相对于结构体首地址的偏移量()都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节();
备注为结构体的一个成员开辟空间之前,编译器首先检查预开辟空间的首地址相对于结构体首地址的偏移是否是本成员的整数倍,若是,则存放本成员,反之,则在本成员和上一个成员之间填充一定的字节,以达到整数倍的要求,也就是将预开辟空间的首地址后移几个字节。
3)&结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要,编译器会在最末一个成员之后加上填充字节()。
备注:结构体总大小是包括填充字节,最后一个成员满足上面两条以外,还必须满足第三条,否则就必须在最后填充几个字节以达到本条要求。&&&
&&&&Windows&32位系统下,中,默认的字节对齐方式是字节对齐。
sizeof(S1)&:因为结构中数据类型都是,最宽基本类型大小是,所以结构大小为,没有进行填充;
sizeof(S2)、:,就被填充了一定的字节;
sizeof(S4):因为设置了对齐方式为字节对齐,所以不会被填充。
在与进行通讯的端程序,建议涉及网络通讯的结构使用字节对齐方式,不然端会增加数据处理的复杂度。
4.3&Java与C++之间基本数据类型的差别
需要注意以下几个数据类型的区别位系统下:
&&&&&&C++&&&&&&&&&&&&&&&&&&&&&&&Java
&&char---------1byte&&&&&&&&& Byte----------1byte
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Char----------2byte2
&&long---------4bytes&&&&&&&& long----------8bytes
Java中的是一个字符,而不是一个字节,与的长度一致;
Java中的是一个字节,与中的含义一致,而中的是无符号的;
Java中的长度为,而中的长度为(中,的长度跟编译器的实现相关)。
关于Java和C++的socket通信时如何传送结构体
问题是这样的:
有一个socket 程序,一端是c++写的socket 服务程序
另一端是Java写客户端程序,两者之间需要通信。
这个案例中c++接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组。
解决方法是:c++socket 在发送结构体的时候其实发送的也是字节流。因为结构体本身也是内存中的一块连续数据。问题就变成了如何把结构体手动转成字节的问题了
例如Java客户端要像服务端发送一个这样的结构体
/*c++ code:
* struct FileInfo
int sessionId;
//文件长度 ,单位字节
char filename[100];
下面两个方法就可以将是结构体转成字节数组。
* 将int转为低字节在前,高字节在后的byte数组
private byte[] toLH(int n)
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n && 8 & 0xff);
b[2] = (byte) (n && 16 & 0xff);
b[3] = (byte) (n && 24 & 0xff);
private byte[] getFileInfo(String filename,int filesize, int sessionId)
byte[] b = new byte[108];&&& &&&
//分别将struct的成员格式为byte数组。&&& &&&
temp = toLH(sessionId);
System.arraycopy(temp, 0, b, 0, temp.length);
temp = toLH(filesize);
System.arraycopy(temp, 0, b, 4, temp.length);&&& &&&
System.arraycopy(filename.getBytes(), 0, b, 8, filename.length());
如果需要用Java 接收结构体的话只需要将上面过程逆过来即可。
另外字节数组直接使用 Java的NIO包中的 ByteBuffer 类更方便,速度也更快。
public class Common {
public static byte[] toLH(int n) {
byte[] b = new byte[4];
b[0] = (byte) (n & 0xff);
b[1] = (byte) (n && 8 & 0xff);
b[2] = (byte) (n && 16 & 0xff);
b[3] = (byte) (n && 24 & 0xff);
public static int bytes2Integer(byte[] byteVal) {
int result = 0;
for (int i = 0; i & byteVal. i++) {
int tmpVal = (byteVal[i] && (8 * (3 - i)));
switch (i) {
tmpVal = tmpVal & 0xFF000000;
tmpVal = tmpVal & 0x00FF0000;
tmpVal = tmpVal & 0x0000FF00;
tmpVal = tmpVal & 0x000000FF;
result = result | tmpV
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:3449360次
积分:32838
积分:32838
排名:第126名
原创:57篇
转载:1369篇
评论:372条
(1)(10)(1)(4)(3)(14)(27)(17)(5)(34)(24)(17)(25)(43)(8)(24)(1)(10)(1)(2)(2)(12)(1)(5)(12)(13)(9)(1)(5)(107)(21)(35)(2)(4)(11)(21)(3)(8)(2)(4)(3)(12)(6)(4)(9)(20)(10)(39)(24)(2)(59)(32)(34)(13)(44)(150)(56)(50)(41)(24)(95)(34)(3)(8)(43)(35)(27)
<a href="/articleJava+socket实现双机通信_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java+socket实现双机通信
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩13页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢

我要回帖

更多关于 腹肌自拍照不露脸 的文章

 

随机推荐