说到java网络通讯章节的内容,刚入门的学员可能会感到比较头疼,应为Socket通信中一定会伴随有IO流的操作,当然对IO流比较熟练的哥们会觉得这是比较好玩的一章,因为一切都在他们的掌握之中,这样操作起来就显得非常得心应手,但是对于IO本来就不是多熟悉的哥们来说就有一定的困难了,在搞清楚IO流操作机制的同时还必须会应用到Socket通信中去,否则会对得到的结果感到非常郁闷和懊恼,下面就和大家一起分享一下自己遇到一点小麻烦后的感触以及给出的解决办法。
要求:客户端通过Socket通信技术上传本地一个文本文件到服务器端(其实就是代替了手动在控制台输入文本),服务器端将客户端上传的文本保存在另一个文本文件中,保存完成后对客户端发送一个“完成保存”的的通知,客户端显示服务器返回的信息并断开和服务器的连接,至此整个通信结束。
以下分两部分来书写完成此任务的代码:
1、客户端:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientSocket{
public static void main(String args[]) throws UnknownHostException,IOException
{
System.out.println("客户端启动了...........");
//1、创建客户端Socket对象同时制定将要连接的服务器的ip地址和端口号
Socket s=new Socket(InetAddress.getByName("192.168.56.4"), 10005);//此处会抛出连接失败的异常,根据自己的需要给出处理办法,这里就直接抛了
//2、设置io操作源,这里有多种选择,因为是操作文本文件,所以就选择可以一行一行读取数据的Io输入流BufferedReader
BufferedReader brfu=new BufferedReader(new FileReader("client.txt"));
//3、设置目的:网络
PrintWriter out=new PrintWriter(s.getOutputStream(),true);//此处也可以选择别的Io输出流,例如:BufferedWriter
//4、开始读取文件内容并上传到服务器端
String line=null;
while((line=brfu.readLine())!=null){
out.println(line);
//此处初学者一定要注意:使用out.print(line);out.flush();也解决不了上传不成功的问题,就是读取文本内容带有回车换行符的原因,如果不使用 out.println(line),当然也可以使用out.print(line+"\r\n")来解决
}
s.shutdownOutput();//此方法是经过socket对象封装后的,目的就是告诉服务器自己发送内容操作结束了,避免服务器阻塞等待而不给客户端发送完成信息
//这里也可以使用发送一个和服务器协商好的结束标示符解决问题,但是那个标示符的选择一定要唯一,并且要做到确保上传文件中不会出现这个标示符(时间的毫秒值)
//5、创建接受服务器端返回数据的IO输入流
BufferedReader brIn=new BufferedReader(new InputStreamReader(s.getInputStream()));
//6、输出服务器返回的数据
System.out.println("Server data :"+brIn.readLine());
//7、关闭资源
brfu.close();
s.close();//其他的IO流对象不用关闭了,因为它们都依靠s,s关闭就可以了
}
}
2、服务器端
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ServersSocket {
public static void main(String[] args) throws IOException {
System.out.println("服务器端启动了....");
//1、创建服务器端对象,同时绑定监听的端口号
ServerSocket ss=new ServerSocket(10005);
//2、获取客户端对象
Socket s=ss.accept();
//3、获取客户端ip地址和客户端名称
String ip=s.getInetAddress().getHostAddress();
String name=s.getInetAddress().getHostName();
System.out.println("接受到来自名称为:"+name+" 和ip为:"+ip+"的连接");
//4、获取IO数据源
BufferedReader brfu=new BufferedReader(new InputStreamReader(s.getInputStream()));
//5、设置目的,创建本地的文本文件
PrintWriter out=new PrintWriter(new FileWriter("server.txt"),true);
//上面的代码等效于BufferedWriter bw=new BufferedWriter(new FileWriter("server.txt"))
//6、开始保存数据的操作
String line=null;
while((line=brfu.readLine())!=null){
out.write(line+"\r\n");
System.out.println(line);
}
//7、创建服务器端源:网络
PrintWriter outSer=new PrintWriter(s.getOutputStream(),true);
outSer.println("接受并保存完成!");
//8、关闭IO和网络资源
out.close();
s.close();
ss.close();
}
}