_151_Java_基于Socket的TCP编程
-----------------
-------------------
--------------------
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.net.UnknownHostException;
import org.junit.Test;
//客户端向服务器发送信息,服务端输出信息到控制台上,服务端同时向客户端发送信息
public class TestTCP2 {
//客户端
@Test
public void client() {
OutputStream os=null;
Socket socket=null;
InputStream inputStream =null;
//utf-8:中文字符存儲是三个字节
try {
socket=new Socket(InetAddress.getByName("127.0.0.1"), 8989);
os = socket.getOutputStream();
os.write("as的d客户端jjff".getBytes());
//shutdownOutput:显示告诉服务端已经接受完毕
socket.shutdownOutput();
inputStream = socket.getInputStream();
//utf-8:中文字符是三个字节
//GBK、GB2312收编的汉字占2个字节
//实用的 Unicode 版本对应于 UCS-2,使用16位的编码空间。也就是每个字符占用2个字
//UCS-2 就改名成了 UTF-16。
byte[]b=new byte[6];
int len;
//此处做一个简单的测试(这里是UTF-8编码)
//每次存储4个字节,然后检测是否有中文被拆开,有拆开则需要补字节
while((len=inputStream.read(b,0,4))!=-1) {
boolean flag=false;
if(b[3]<0) {
int num=0;
for(int i=1;i<3;i++) {
if(b[i]>0) {
num++;
}
}
inputStream.read(b,4,num);
len+=num;
flag=true;
System.out.println(len);
}
if(b[0]<0) {
inputStream.read(b,4,2);
len+=2;
flag=true;
System.out.println(len+" 补字节");
}
String string = new String(b,0,len);
System.out.println(string);
for(int i=0;i<len;i++) {
System.out.println(b[i]);
}
if(flag) {
b[4]=0;
b[5]=0;
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if(inputStream!=null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(os!=null) {
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//服务端
@Test
public void server() {
ServerSocket serverSocket=null;
Socket socket=null;
InputStream inputStream=null;
OutputStream outputStream = null;
try {
serverSocket = new ServerSocket(8989);
socket = serverSocket.accept();
inputStream = socket.getInputStream();
//utf-8:中文字符是三个字节
//GBK、GB2312收编的汉字占2个字节
//实用的 Unicode 版本对应于 UCS-2,使用16位的编码空间。也就是每个字符占用2个字
//UCS-2 就改名成了 UTF-16。
byte[]b=new byte[6];
int size=b.length;
int len;
//此处做一个简单的测试(这里是UTF-8编码)
//每次存储4个字节,然后检测是否有中文被拆开,有拆开则需要补字节
while((len=inputStream.read(b,0,4))!=-1) {
boolean flag=false;
if(b[3]<0) {
int num=0;
for(int i=1;i<3;i++) {
if(b[i]>0) {
num++;
}
}
inputStream.read(b,4,num);
len+=num;
flag=true;
System.out.println(len);
}
if(b[0]<0) {
inputStream.read(b,4,2);
len+=2;
flag=true;
System.out.println(len+" fjghjg");
}
String string = new String(b,0,len);
System.out.println(string);
for(int i=0;i<len;i++) {
System.out.println(b[i]);
}
if(flag) {
b[4]=0;
b[5]=0;
}
}
outputStream = socket.getOutputStream();
outputStream.write("as的d客户端jjff".getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(inputStream!=null) {
try {
inputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(socket!=null) {
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(serverSocket!=null) {
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}