TCP传输
- Socket和ServerSocket
- 建立客户端和服务器端
- 建立连接后,通过Socket中的IO流进行数据的传输
- 关闭socket
- 同样,客户端与服务器端是两个独立的应用程序。
客户端:
1:建立客户端的Socket服务,并明确要连接的服务器。
2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket流,Socket流中既有读取流,也有写入流.
3:通过Socket对象的方法,可以获取这两个流
4:通过流的对象可以对数据进行传输
5:如果传输数据完毕,关闭资源
代码:
package tcpdemo;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
/*tcp协议发送数据:
/1创建发送端的socket对象
这一步如果成功,就说明连接已经建立
/2获取输入流写数据
/3释放资源
/4连接被拒绝需要先打开服务端;
*/
public class Client {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建发送端的socket对象
//Socket(InetAddress address, int port)
//Socket s = new Socket(InetAddress.getByName("192.168.0.120"), 8888);
//Socket(String host, int port)
Socket s = new Socket("192.168.0.120", 8888);
//获取输入流写数据、
OutputStream os = s.getOutputStream();
os.write("hello,tcp,我来了".getBytes());
//释放资源
s.close();
}
}
服务端:
1:建立服务器端的socket服务,需要一个端口
2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信
3:通过客户端的获取流对象的方法,读取数据或者写入数据
4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的
代码:
package tcpdemo;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/*ServerSocket
* tcp协议接收数据:
/1创建接收端的socket对象
/2 监听客户端连接返回对象的socket对象
/3获取输入读取数据显示控制动态
/4释放资源
*/
public class Server {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建接收端的socket对象
//ServerSocket(int port)
ServerSocket ss = new ServerSocket(8888);
//监听客户端连接返回对象的socket对象
Socket s = ss.accept();
//获取输入读取数据显示控制动态
byte[] bys = new byte[1024];
int len = s.getInputStream().read(bys);
String st = new String(bys,0,len);
System.out.println(s.getInetAddress().getHostAddress()+":" + st);
//释放客户端资源服务器等待下一次连接
s.close();
//ss.close();
}
}
升级版本:
客户端键盘录入,服务器输出控制台:
client:
package tcpdemo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/*创建tcp连接实现从屏幕录入功能
*
*
* */
public class UpgClient {
public static void main(String[] args) throws IOException {
//创建客户端socket对象
Socket s = new Socket("192.168.0.120", 12306);
//封装键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//封装通道内写数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line=br.readLine()) !=null) {
if("886".equals(line)) {
break;
}
bw.write(line);
bw.newLine();
bw.flush();
}
//bw.close();
//br.close();
s.close();
}
}
server:
package tcpdemo;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UpgServer {
public static void main(String[] args) throws IOException {
/*//创建socket
ServerSocket ss = new ServerSocket(12306);
//监听
Socket s = ss.accept();
//包装通道内容中的流
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
s.close();*/
//----------------------将客户端传输过来的信息写入到文件---------------------
//创建socket
ServerSocket ss = new ServerSocket(12306);
//监听
Socket s = ss.accept();
//包装通道内容中的流
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//封装文本文件
BufferedWriter bw = new BufferedWriter(new FileWriter("a.txt"));
String line = null;
while ((line=br.readLine())!=null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
//br.close();
s.close();
//ss.close();
}
}
客户端文本文件,服务端输出到控制台/输出文本文件;
package tcpdemo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class client {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建客户端socket
Socket s = new Socket("192.168.0.120", 1234);
//包装文本文件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
//包装通道流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
//释放资源
br.close();
s.close();
}
}
sever:
package tcpdemo2;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;
public class server {
public static void main(String[] args) throws IOException {
//-----------------输出到控制台-------------------------------
// TODO Auto-generated method stub
//创建服务端socket
/*ServerSocket ss =new ServerSocket(1234);
//监听
Socket s = ss.accept();
//包装通道流
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
String line = null;
while((line=br.readLine()) !=null) {
System.out.println(line);
}
s.close();*/
//-----------------输出到文本------------------------------------
ServerSocket ss = new ServerSocket(1234);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));
String line = null;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
bw.close();
s.close();
}
}
文件传输,服务器给与反馈;
client:
package tcpdemo3.copy;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class client {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建客户端socket
Socket s = new Socket("192.168.0.120", 1234);
//包装文本文件
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
//包装通道流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line = null;
while((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}
/*bw.write("over");
bw.newLine();
bw.flush();*/
//socket提供的终止功能通知服务器已经终止了
s.shutdownOutput();
BufferedReader clientbr = new BufferedReader(new InputStreamReader(s.getInputStream()));
String clinet = clientbr.readLine();
System.out.println(clinet);
//释放资源
br.close();
s.close();
}
}
server:
package tcpdemo3.copy;
//文件传输完成后服务器给客户端返回信息,告诉客户端已经收到文件
//当客户端吧数据发送完以后,服务器不知道客户端已经将文件上传完毕将会堵塞程序
//解决方法一:多写入一句话告诉服务端收到这句话我就是把文件上传完毕,弊端如果文件中包含这句话则会直接关闭出现文件上传不完整的情况。
//解决方法二socket提供了一种解决方法
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.Buffer;
public class server {
public static void main(String[] args) throws IOException {
//-----------------输出到文本------------------------------------
ServerSocket ss = new ServerSocket(1234);
Socket s = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));
String line = null;
while((line = br.readLine()) != null) {
/*if("over".equals(line)) {
break;
}*/
bw.write(line);
bw.newLine();
bw.flush();
}
BufferedWriter serverbw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
serverbw.write("文件上传成功");
serverbw.newLine();
serverbw.flush();
serverbw.close();
bw.close();
s.close();
}
}
传递图片并给出反馈:
client:
package tcpdemo3.copy;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Picclient {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建socket
Socket s = new Socket("127.0.0.1", 1123);
//封装输入流:
BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream());
//封装图片
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("2.png"));
byte[] bys = new byte[1024];
int len =0;
while((len = bis.read(bys)) !=-1) {
bos.write(bys,0,len);
bos.flush();
}
//告诉服务端传输完毕
s.shutdownOutput();
//读取反馈
InputStream is = s.getInputStream();
byte[] bys2 = new byte[1024];
int len2 = is.read(bys2);
String client = new String(bys2, 0, len);
System.out.println(client);
//释放资源
bis.close();
s.close();
}
}
server:
package tcpdemo3.copy;
//图片上传并且给与反馈
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Picserver {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//创建服务端socket
ServerSocket ss = new ServerSocket(1123);
//监听客户端连接
Socket s = ss.accept();
//包装通道输入流
//基本字节流转换为高效流
BufferedInputStream bis = new BufferedInputStream(s.getInputStream());
//封装图片文件
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("mm.png"));
byte[] bys = new byte[1024];
int len=0;
while ((len=bis.read(bys)) !=-1) {
bos.write(bys,0,len);
bos.flush();
}
//给一个反馈
OutputStream os = s.getOutputStream();
os.write("收到".getBytes());
//关闭资源
bos.close();
s.close();
}
}