package com.pers.tcptest;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner; import org.junit.Test; public class TCPTest { @Test// 客户端
public void client() {
Socket socket = null;
Scanner scanner = null;
OutputStream os = null;
InputStream is = null;
try {
socket = new Socket(InetAddress.getByName("127.0.0.1"), );
// 输出流 程序到数据 write
os = socket.getOutputStream();
System.out.println("请输入多个字符:");
// 封装键盘输入流
scanner = new Scanner(System.in);
String str = scanner.next();
os.write(str.getBytes());//发送出去
//必须加上 表示我这边发送结束 服务端可以read去循环读取了 交互性
socket.shutdownOutput();
// 输入流 把数据读到程序中 显示出来
is = socket.getInputStream();
byte[] b = new byte[];
int len;
while ((len = is.read(b)) != -) {
String str2 = new String(b, , len);
System.out.println(str2);// str2是读取到的所有信息内容
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 一定记得把稀缺的流资源关闭,一旦上面报错 关闭流 判断是否为null 避免还没创建流呢 就执行关闭 造成空指针异常
if (is != null) {
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} try {
if (os != null) {
os.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (scanner != null)
scanner.close();
try {
if (socket != null) {
socket.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } @Test// 服务端
public void server() {
ServerSocket ss = null;
Socket socket = null;
// 接受来自客户端的信息
InputStream is = null;
// 返回给客户端信息
OutputStream os = null;
try {
ss = new ServerSocket();
socket = ss.accept();
// 接受来自客户端的信息
is = socket.getInputStream();
byte[] b = new byte[];//输入 就要 考虑接收一下读过来的字节数据
int len;
String str = new String();
while ((len = is.read(b)) != -) {//考虑多余10个字节的数据 一次读取不完 分批次放到str中
String str2 = new String(b, , len);
str += str2;
System.out.println("服务端接收过来的信息是:"+str);
}
// 返回给客户端大写的串信息
os = socket.getOutputStream();
os.write(str.toUpperCase().getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (os != null) {
os.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
is.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
socket.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
ss.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
----------------------------------运行结果 先执行服务端 再执行客户端
客户端
请输入多个字符:
hdhaihdoihio (点击回车,服务端接收转为大写之后再发送给客户端)
HDHAIHDOIH (因为一次读取10个字节 所以分两次读完的)
IO
服务端
服务端接收过来的信息是:hdhaihdoih
服务端接收过来的信息是:io

课余之外  可以去了解两个东东  如下:

最新文章

  1. django的cookie和session以及内置信号、缓存
  2. 关于easyui遇到的问题
  3. css 字间距、CSS字体间距、css 字符间距设置
  4. Spring 事务传递教程_有实例
  5. ssm开发的一点小技巧
  6. bzoj 4278 [ONTAK2015]Tasowanie(SA,贪心)
  7. ActiveX添加测试工程, 出现的问题[非选择性参数][找不到成员]
  8. 制作chm格式的帮助文档
  9. 使用VNC完毕远程调用图形化
  10. C#在winform中读写ini文件
  11. Leetcode 3——Palindrome Number(回文数)
  12. 网络编程一定要看过的socket另一座大山
  13. Nerd的套现ATM机
  14. Team Dipper
  15. Android开发之实现多次点击事件
  16. php & 变量引用、函数引用、对象引用
  17. python unnitest 经验总结
  18. 数据库 - SQLite3 中的数据类型
  19. sqlplus远程连接oracle
  20. getXXXPos()约定

热门文章

  1. ASP.NET MVC:Cookie 的过期时间在服务器端是获取不到的
  2. 从CRITS发展历史解读结构框架
  3. 蓝精灵:寻找神秘村Smurfs: The Lost Village迅雷下载
  4. Windows下LuaJIT的编译和使用
  5. USB OTG简单介绍、与普通USB线的差别
  6. Mysql 的子查询
  7. Jenkins 快速搭建
  8. iOS:三种常见计时器(NSTimer、CADisplayLink、dispatch_source_t)的使用
  9. 如何同步两台Linux机器的时间?
  10. 实战体验几种MySQL Cluster方案(转)