TCP传输,客户端建立的过程
1.创建tcp客户端socket服务,使用的是socket对象。
建议改对象一创建就明确目的,要连接的主机
2.如果连接建立成功,说明数据传输通道已经建立
该通道就是socket流,是底层建立好的,既然是流,说明
这里既有输入又有输出。
想要输入或者输出流对象,可以找Socket对象来获取
可以通过getOutputStream(),getInputStream()来获取两个字节流
3.使用输出流,将数据写出
4.关闭资源
tcp服务端的思路:
1.创建服务端socket服务,通过ServerSocket对象
2.服务端必须对外提供一个端口,否则客户端无法连接
3.获取连接过来的客户端对象
程序:
客户端:
publicstatic void main(String[] args) throws UnknownHostException, IOException {
//建立客户端socket对象
Socketsocket = new Socket("10.64.100.11",10002);
//获取输出流,源是本机内存,目的是外部设备网络
OutputStreamout = socket.getOutputStream();
//从本地写入数据到输出流
out.write("呵呵来了".getBytes());
//获取从服务器端发来的提示信息
InputStreamin = socket.getInputStream();
byte[]buf = new byte[1024];
intlen = in.read(buf);
syso(buf,0,len);
//关闭资源
socket.close();
}
服务端:
publicstatic void main(String[] args) throws IOException {
//1.创建服务器对象
ServerSocketss = new ServerSocket(10002);
//2.获取连接过来的客户端对象
Sockets = ss.accept();//阻塞式
//3.通过Socket对象获取输入流,要读取客户端发来的数据,源是外部设备网络,目的是服务器
InputStreamin = s.getInputStream();
byte[]buf = new byte[1024];
intlen = in.read(buf);
Stringip =s.getInetAddress().getHostAddress();//获取ip地址字符串的表示形式
System.out.println(ip+":"+newString(buf,0,len));
//给客户端发送提示信息
OutputStreamout = s.getOutputStream();
out.write("收到".getBytes());
//ss.close();
s.close();
}
需求:
客户端输入字母数据,发送给服务端,服务端收到后显示在控制台中,并将数据转换成大写返回给客户端。
直到客户端输入over,转换结束。其实就是创建一个英文大写转换服务器
程序
publicstatic void main(String[] args) throws UnknownHostException, IOException {
//1.创建Socket对象
Sockets = new Socket("xx.xx.xx.xx", 10003);
//2.获取输出流
OutputStreamout = s.getOutputStream();
//3.获取输出的内容
//Stringstr = "kkkkllla";
//如果是键盘录入
BufferedReaderbufr = new BufferedReader(new InputStreamReader(System.in));
Stringline = null;
while((line= bufr.readLine())!=null){
byte[]buf = line.getBytes();
out.write(buf);
//4.获取转换后的流
InputStreamin = s.getInputStream();
//5.获取转换后的流并输出
byte[]buf1 = new byte[1024];
intlen = in.read(buf1);
System.out.println("转换后的数据"+newString(buf1,0,len));
}
//6.关闭资源
s.close();
/*
*第二种方法
*从27行开始
* PrintWriter out = newPrintWriter(s.getOutputStream(),true);//自动刷新
* BufferedReader bufIn = newBufferedReader(new InputStreamReader(s.getInputStream()));
* while((line = bufr.readLine())!=null){
out.println(line);
//4.获取转换后的流
*String toUpperStr = bufIn.readLine()
System.out.println("转换后的数据"+toUpperStr);
}
*/
}
publicstatic void main(String[] args) throws IOException {
//1.创建ServerSocket对象
ServerSocketss = new ServerSocket(10003);
//2.获取连接的客户端的Socket对象
Sockets = ss.accept();
//3.获取输入流
InputStreamin = s.getInputStream();
byte[]buf = new byte[1024];
intlen = in.read(buf);
Stringstr = new String(buf,0,len);
str= str.toUpperCase();//转成大写
//4.获取输出流
OutputStreamout = s.getOutputStream();
out.write(str.getBytes());
//5.关闭资源
s.close();
ss.close();//通常不用关闭
/*
*第二种
*从19行开始
* BufferedReader bufrIn = newBufferedReader(new InputStreamReader(s.getInputStream()));
* PrintWriter out = newPritnWriter(s.getOutputStream());
* String line = null;
* while((line = bufrIn.readLine())!=null){
* out.println(line.totoUpperCase());
* }
*/
}
}
注意:如果遇到等待状态,一般就是阻塞式程序处于阻塞,例如如果上面的程序输出流不加入换行,则readLine()无法读到结束标志,处于等待。
如果上面的程序不带有刷新,则数据会存储在PrintWriter中,而不会写入OutputStream()中。