TCP一次传输
TCP的传输的客户端和服务端的互访
TCP服务端转换客户端文本
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* TCP传输
* Socket 和ServerSocket
* 建立客户端和服务器端
* 建立连接后,通过Socket中的IO流进行数据的传递
* 关闭Socket
* 同样,客户端与服务器端是两个独立的应用程序.
*
* 客户端:
* 通过查阅socke对象,发现在该对象建立的时候,就可以去连接指定的主机.
* 因为tcp是面向连接的,所以在建立socket的服务时,就要有服务端存在,并连接成功.形成通路后,在该通道进行数据的传输.
*
* 步骤
* 1.创建Socket服务,并指定要连接的主机和端口,必须要启动服务器端监听
* 2.然后创建 客户端,然后开始交流
*
* 需求:给服务端发送一个文本数据
*
*/
class TcpClient{
public static void main(String[] args) throws IOException{
Socket s=new Socket("192.168.1.121",10000);
OutputStream out=s.getOutputStream();
out.write("tcp 哥们来了".getBytes());
s.close();
}
}
/**
* 需求:定义端点接受数据并打印在控制台上
* 服务端:
* 1.建立服务器端的socket服务, ServerSocket()
* 并监听一个端口.
* 2. 获取连接过来的客户端对象.
* 通过ServerScoket的accept方法,所以这个方法是阻塞式的
* 3.客户端如果发来数据,那么服务端要使用对应的客户对象,并获取到该客户端对象的读取流读取发过来的数据
* 并打印在控制台.
* 4.关闭服务器 (可选)
*
*
*/
class TcpServer{
public static void main(String[] args) throws IOException{
//建立服务端socket服务,并监听一个端口
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//获取客户端发送过来的额数据,那么要使用客户端对象的读取流来读取数据
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));//关闭客户端
s.close();
ss.close();
}
}
TCP的传输的客户端和服务端的互访
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 演示 tcp的传输的客户端和服务端的互访
*
* 需求:客户端给服务端发送数据,服务端接手后,给客户端反馈系信息
*
* 客户端:
* 1.建立Socket服务,指定要连接主机和端口
* 2.获取socket流中的输出流,将数据写到该流中,通过网络发送给服务端
* 3.获取socket流中的输入流,将服务端反馈的数据获取到,并打印
* 4.关闭资源
*/
class TcpClient2{
public static void main(String[] args) throws IOException{
Socket s=new Socket("192.168.1.121",10000);
OutputStream out=s.getOutputStream();
out.write("服务端,你好吗?".getBytes());
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
}
}
class TcpServer2{
public static void main(String[] args) throws IOException{
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+".....connected");
InputStream in=s.getInputStream();
byte[] buf=new byte[1024];
int len=in.read(buf);
System.out.println(new String(buf,0,len));
OutputStream out=s.getOutputStream();
out.write("我很好,thankyou!".getBytes());
s.close();
ss.close();
}
}
TCP服务端转换客户端文本
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/**
*
* 需求:建立一个文本转换服务器
* 客户端给服务端发送一个,服务端会将文本转成大写再返回给客户端.
* 而且客户端可以不端的进行文本转换.当客户端输入over时,转换结束.
*
*
* 分析
* 客户端:
* 既然是操作设备上的数据,就可以使用io技术,并按照io的操作规律来思考
* 源:键盘录入
* 目的:网络设备,网络输出流.
* 可以操作的是文本数据,可以选择字符流
*
* 步骤:
* 1.建立服务
* 2.获取键盘录入
* 3.将数据发送给服务端
* 4.获取服务端的的反馈数据
* 5.结束,关资源
* 都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲.
*
*
* 该例子出现的问题:
* 现象:客户端和服务端都在莫名的等待.
* 为什么呢?
* 因为客户端和服务端都有阻塞式方式,这些方法么有读取到结束标记,
* 那么就一直等.而导致两端都在等待.
*
*/
class TransClient{
public static void main(String[] args) throws IOException{
Socket s=new Socket("192.168.1.121",10000);
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//优化
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
BufferedReader bufrs=new BufferedReader(new InputStreamReader(s.getInputStream()));
String line=null;
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
out.println(line);
/*
bufw.write(line);
bufw.newLine(); //缓冲区的 读取结束标记
bufw.flush();*/
String str=bufrs.readLine();
System.out.println("Server:"+str);
}
bufr.close();
s.close();
}
}
class TransServer{
public static void main(String[] args) throws IOException{
ServerSocket ss=new ServerSocket(10000);
Socket s=ss.accept();
String ip=s.getInetAddress().getHostAddress();
System.out.println(ip+"....connected");
//读取socket流中的数据
BufferedReader bufr=new BufferedReader(new InputStreamReader(s.getInputStream()));
//目的Socket输入流,将大写的写入到socket输出流,并发给客户端
//BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
//优化
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
String line=null;
while((line=bufr.readLine())!=null){
System.out.println(line);
out.println(line.toUpperCase());
/*
bufw.write(line.toUpperCase());
bufw.newLine(); //缓冲区的 读取结束标记
bufw.flush();*/
}
s.close();
ss.close();
}
}