两个类Socket、 ServerSocket
连接步骤:
- 建立客户端和服务器端
- 建立连接后,通过Socket中的IO流进行数据的传输
- 关闭socket
基本思路:
客户端
客户端需要明确服务器的ip地址以及端口,这样才可以去试着建立连接,如果连接失败,会出现异常。
连接成功,说明客户端与服务端建立了通道,那么通过IO流就可以进行数据的传输,而Socket对象已经提供了输入流和输出流对象,通过getInputStream(), getOutputStream()获取即可。
与服务端通讯结束后,关闭Socket。服务器
服务端需要明确它要处理的数据是从哪个端口进入的。
当有客户端访问时,要明确是哪个客户端,可通过accept()获取已连接的客户端对象,并通过该对象与客户端通过IO流进行数据传输。
当该客户端访问结束,关闭该客户端。
下面演示结合代码演示:
要求:
读取一个本地文本文件,将数据发送到服务端,服务器端对数据进行存储。 存储完毕后,给客户端一个提示。
ackage cn.hncu.tcp.upload;
import java.io.BufferedReader;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
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 UpLoadTextClient {
public static void main(String[] args) {
try {
Socket s=new Socket(InetAddress.getByName("127.0.0.1"), 10000);
//思路:把本地文件的数据读取出来通过 s.getOutputStream()获得的out对象发送出去
BufferedReader br=new BufferedReader(new FileReader("tempfiles\\client.txt"));
//这里的输出流 对应的是服务器端的输入流
//建议不要用BufferedWriter
PrintWriter pw=new PrintWriter(s.getOutputStream(), true);
String str=null;
while((str=br.readLine())!=null){
pw.println(str);
}
//法1:pw.println("over#$@#@$");//不能出现文件中存在的结束关键字---搞特殊一点
//pw.println("over#$@#@$");
//法2---建议采用该种方式---由socket内部来指定结束标记
s.shutdownOutput();
br.close();
//接收服务器给的结束标记
BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream()));
String info = br2.readLine();
System.out.println("server应答:"+info);
s.close();
br.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void testFileInputSteam() throws FileNotFoundException,
IOException {
FileInputStream fin=new FileInputStream("tempfiles\\client.txt");
while (fin.available()>0) {
try {
int b = fin.read();
System.out.print((char) b);
} catch (EOFException e) {
break;
}
}
fin.close();
}
}
package cn.hncu.tcp.upload;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UpLoadTextSever {
public static void main(String[] args) {
try {
ServerSocket server=new ServerSocket(10000);
System.out.println("准备上传");
Socket s=server.accept();
System.out.println(s.getInetAddress().getHostAddress()+"...connected");
//读取客户端上传过来的文本文件
//源 ---socket(字节流)---额外:需要转换成字符流 ,缓存流
BufferedReader br=new BufferedReader(new InputStreamReader(s.getInputStream()));
//目的 ---硬盘字符流 FileWriter---额外:打印流
PrintWriter pw=new PrintWriter("tempfiles\\server.txt");
String str=null;
while((str=br.readLine())!=null){
// if("over#$@#@$".equals(str)){
// break;
// }
pw.println(str);
}
pw.close();
//上传成功,给客户端一个提示信息
PrintWriter pw2=new PrintWriter(s.getOutputStream(),true);
pw2.println("上传成功!");
pw2.close();
s.close();
server.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}