socket通讯是基于tcp/ip协议的连接,该协议是基于ip和端口的,socket服务端跑起来之后会一直监控发送到某个端口上的数据,但是,socket所传输的内容不像文件一样,文件内容结尾是有标志符的,而socket传输的内容没有结尾标志符,所以socket传输内容如果不关闭流,read方法和readline方法在读取完数据后,会处于阻塞状态,一直等待数据传输过来,因为流没有关闭,会话还在进行。
像下面的代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 1、创建客户端Socket,指定服务器地址和端口
try {
Socket socket = new Socket("localhost", 8888);
// 2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();// 获取字节输出流
// 将输出流包装为打印流
PrintWriter pw = new PrintWriter(os);
pw.write("admin 123");
pw.flush();
// 3、获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info = br.readLine())!=null){
System.out.println("我是客户端,服务器跟我说:"+new String(info.getBytes(), "UTF-8"));
}
// 4、关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 基于TCP协议的Socket通信,实现用户登录
* 服务器端
*/
public class Server {
public static void main(String[] args) {
try {
// 1、创建一个服务器Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
// 2、调用()方法开始监听,等待客户端的连接
System.out.println("***服务器即将启动,等待客户端的连接***");
Socket socket = serverSocket.accept();// 就会处于阻塞的状态,等待监听
// 3、获取输入流,病读取客户端信息
InputStream is = socket.getInputStream();// 字节输入流
// 将字节流转换为字符流
InputStreamReader isr = new InputStreamReader(is);
// 为输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info = br.readLine())!=null){
System.out.println("我是服务器,读取客户端发过来的信息:"+new String(info.getBytes(), "UTF-8"));
}
// 4、作为服务器端,就需要响应客户端的请求,使用输出流来响应
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();//调用flush()方法将缓冲输出
// 5、关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
}
}
运行结果是服务端一直在读取,并阻塞到readline方法上。
只需要在每次交互后,关闭流就可以正常完成一次会话。
客户端: socket.shutdownInput();//关闭输入流
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 基于TCP协议的Socket通信,实现用户登录
* 服务器端
*/
public class Server {
public static void main(String[] args) {
try {
// 1、创建一个服务器Socket,即ServerSocket,指定绑定的端口,并监听此端口
ServerSocket serverSocket = new ServerSocket(8888);
// 2、调用()方法开始监听,等待客户端的连接
System.out.println("***服务器即将启动,等待客户端的连接***");
Socket socket = serverSocket.accept();// 就会处于阻塞的状态,等待监听
// 3、获取输入流,病读取客户端信息
InputStream is = socket.getInputStream();// 字节输入流
// 将字节流转换为字符流
InputStreamReader isr = new InputStreamReader(is);
// 为输入流添加缓冲
BufferedReader br = new BufferedReader(isr);
String info = null;
while((info = br.readLine())!=null){
System.out.println("我是服务器,读取客户端发过来的信息:"+new String(info.getBytes(), "UTF-8"));
}
socket.shutdownInput();//关闭输入流
// 4、作为服务器端,就需要响应客户端的请求,使用输出流来响应
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
pw.write("欢迎您!");
pw.flush();//调用flush()方法将缓冲输出
// 5、关闭资源
pw.close();
os.close();
br.close();
isr.close();
is.close();
socket.close();
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
}
}
客户端:socket.shutdownOutput();//关闭输出流
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*
* 客户端
*/
public class Client {
public static void main(String[] args) {
// 1、创建客户端Socket,指定服务器地址和端口
try {
Socket socket = new Socket("localhost", 8888);
// 2、获取输出流,向服务器端发送信息
OutputStream os = socket.getOutputStream();// 获取字节输出流
// 将输出流包装为打印流
PrintWriter pw = new PrintWriter(os);
pw.write("admin 123");
pw.flush();
socket.shutdownOutput();//关闭输出流
// 3、获取输入流,并读取服务器端的响应信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info = br.readLine())!=null){
System.out.println("我是客户端,服务器跟我说:"+new String(info.getBytes(), "UTF-8"));
}
// 4、关闭资源
br.close();
is.close();
pw.close();
os.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
会发现可以完成一次会话了
socket通讯是基于tcp/ip协议的连接,该协议是基于ip和端口的,socket服务端跑起来之后会一直监控发送到某个端口上的数据,但是,socket所传输的内容不像文件一样,文件内容结尾是有标志符的,而socket传输的内容没有结尾标志符,所以socket传输内容如果不关闭流,read方法和readline方法在读取完数据后,会处于阻塞状态,一直等待数据传输过来,因为流没有关闭,会话...
1 引 言
随着社会的发展和互联网技术的发展,普通老百姓也能够拥有属于自己的计算机,在平常的生活中也离不开了网络技术的支持,而替代了电话和写信的网上即时聊天成为了人们十分常见的沟通方式。
本软件是采用sun公司开发提供的java语言制作的,是基于C/S模型的网上聊天室。这个系统分为两个部分,服务
端
和客户
端
。服务
端
的工作主要是来监听和
接收
来自客户
端
的请求,然后处理客户
端
发来的
消息
,并通知客户
端
。而客户
端
的功能是能够让新用户注册,通过用户名密码登陆并且使用该系统。通过服务
端
和客户
端
的协同工作最终使用户能够使用网络聊天室,在聊天室中完成用户和用户之间的沟通。
2 网络聊天室简介
当今社会,能够实现即时
通讯
的软件使用频率是十分恐怖的,网络聊天室作为它的一种,使用人数也是相当可观的。国内处于垄断的QQ,业界老大哥微软的MSN都是大众关注和使用的焦点,普通老百姓也能够拥有属于自己的计算机,在平常的生活中也离不开了网络技术的支持,它是人们的生活变得十分的便利和高效,你能在网上找到自己想要的信息和有共同兴趣爱好的朋友。而且,现在很多的软件还有多人聊天,电子会议等一系列功能。
2.1 网络聊天室现状和发展
网上即时聊天室是广泛使用的一种技术,它的简单方便的沟通方式能够被广大的网上用户所使用。在当今社会,网上聊天是互联网服务重要的一环,有大约43%的用户都会使用网上聊天,是排在第四位。但是有很多人认为网络聊天室就是一种用来娱乐和打发时间的方式,而缺少了实际的价值。就目前来说,能够完成收入的网络聊天室其实并不多。它应该怎么实现自己的商业价值外界并没有过多的关注。
现在,很多企业都会开发属于自己的聊天室,用户通过该网站注册的用户名以及密码登陆到企业的服务器上。在聊天室中,用户之间可以通过输入文字以及各种符号来表达自己的想法,来达到互相之间的沟通。目前,开发一个供用户使用的网络聊天室的技术门槛并不是很高,也不需要大量的资金,国家对于这方面的管制和政策也没有太限制,所以当今社会上聊天室的竞争其实是很激烈的,腾讯,网易,新浪都有属于自己的网络聊天室
* 文件传输,客户
端
到服务器,
关闭
流
可以自动
关闭
Socket
*
流
只需要
关闭
最外层的
流
,内层的
流
也会自动
关闭
,但不能再有外层的
流
时去
关闭
内存的
流
* 那样会导致外层的
流
不能正常运行
* @throws IOException
服务器
端
@Test
public void testServer1() throws IOException {
Server
Socket
server
Socket
= ne.
在使用
socket
进行全双工通信时,原本以为输入
流
和输出
流
是分开
关闭
的,然而不管
关闭
哪个都会直接
关闭
socket
;可以使用
socket
.shutdownInput()和
socket
.shutdownOutput()
使用InputStream
进入bebug模式,在执行到 inputStream.close()后进入
Socket
InputStream的close()方法,而这个方法是
关闭
socket
流
执行reader.close()后,最后也是执行
Socket
InputStream的close(
这节我们来完成
socket
文件传输程序,这是一个非常实用的例子。要实现的功能为:client 从 server下载一个文件并保存到本地。
编写这个程序需要注意两个问题:
(1)文件大小不确定,有可能比缓冲区大很多,调用一次 write()/send() 函数不能完成文件
内容
的
发送
。
接收
数据时也会遇到同样的情况。
要解决这个问题,可以使用 while 循环,例如:
//server代码
ch...
Case:客户
端
程序正常运行的情况下,拔掉网线,杀掉客户
端
程序
目的:模拟客户
端
死机、系统突然重启、网线松动或网络不通等情况
结论:这种情况下服务器程序没有检测到任何异常,并最后等待“超时”才断开TCP连接
项目中,用到将rtf文档上传后修改一个更新标记为0未更新,另外一个程序将文档上传到LED屏上面,LED程序检测到更新标记为未更新时将状态投到LED上面,并将状态更新为1已更新。
现象:上传文件时使用输入输出
流
,上传成功后LED屏不显示更新文档,为空。
部分代码:
public void save(){
upload();
save(XX
在C语言编程中,可以使用select()函数来设置
socket
通信rcv函数
接收
不到
数据而不断开,可以参考以下示例代码: fd_set readfds;
struct timeval timeout;
timeout.tv_sec = 30;
timeout.tv_usec = 0;
while (1) {
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);
retval = select(sockfd + 1, &readfds, NULL, NULL, &timeout);
if (retval == -1)
break;
else if (retval == 0)
printf("timeout\n");
else {
recv(sockfd, buf, sizeof(buf), 0);
printf("%s\n", buf);