简单的socket短连接
文中讲述数据流,字节流,对象分别输入和输出的简单实现。
客户端类,模拟客户端发送数据:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.Socket;
import java.net.UnknownHostException;
public class Client {
public static void main(String[] args) {
Socket socket = null;
try {
//1.建立TCP连接
socket=new Socket(CSUtils.ip,CSUtils.port);
//2.传输内容
String content="java客户端";
CSUtils.log(true,"发送数据:",content);
OutputStream os=socket.getOutputStream();
InputStream is = socket.getInputStream();
byte[] bstream=content.getBytes(CSUtils.encode);
byte[] botream=null;
if(CSUtils.SOCKETTYPE == CSUtils.SOCKETS)
//InputStream/OutputStream
{
//获取输出流,输送数据到远程服务器
os.write(bstream);
//获取输入流,得到服务器返回的数据
int count = 0;
while (count == 0) {
//如果使用available()方法,多次获取更靠谱品
//对发发送的数据可能还没有到达,你得到的count是0
//调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。
//数据要到达的情况下才能通过available取到数据
count = is.available();
if(count > 0){
botream = new byte[count];
is.read(botream);
CSUtils.log(true,"接收数据:",new String(botream,CSUtils.encode));
}
}
}
if(CSUtils.SOCKETTYPE == CSUtils.SOCKETD)
//DataOutputStream/DataInputStream
{
DataOutputStream dops = new DataOutputStream(os);
dops.write(bstream);
DataInputStream dips = new DataInputStream(is);
int count = 0;
while (count == 0) {
count = dips.available();
if(count > 0){
botream = new byte[count];
dips.read(botream);
CSUtils.log(true,"接收数据:",new String(botream,CSUtils.encode));
}
}
}
if(CSUtils.SOCKETTYPE == CSUtils.SOCKETO)
{
try {
ObjectOutputStream dops = new ObjectOutputStream(os);
dops.writeObject(content);
ObjectInputStream dips = new ObjectInputStream(is);
Object o = dips.readObject();
CSUtils.log(true,"接收数据:",(String)o);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//数据传输关闭连接
if(socket!=null){
try{
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端类,模拟服务端接收数据:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Service {
public void startServer(){
Socket socket = null;
try {
//创建服务端连接实例,设,监听该端口接收到的连接
ServerSocket serverSocket = new ServerSocket(CSUtils.port);
//获取客户端连接
socket = serverSocket.accept();
//1.
//获取字节输入流
InputStream is = socket.getInputStream();
//获取字节输出流返回给客户端数据
OutputStream os = socket.getOutputStream();
if(CSUtils.SOCKETTYPE == CSUtils.SOCKETS)
//InputStream/OutputStream
{
//获取消息的长度
int count = 0;
byte[] body = null;
while(count == 0){
count = is.available();
if(count > 0){
//读取消息并转为String
body = new byte[count];
is.read(body);
String message = new String(body,CSUtils.encode);
CSUtils.log(false,"接收数据:",message);
}
}
String result = "123";
body = result.getBytes(CSUtils.encode);
CSUtils.log(false,"发送数据:",new String(body));
os.write(body);
}
if(CSUtils.SOCKETTYPE == CSUtils.SOCKETD)
//DataOutputStream/DataInputStream
{
DataOutputStream dops = new DataOutputStream(os);
DataInputStream dips = new DataInputStream(is);
int count = 0;
byte[] body = null;
while(count == 0){
count = dips.available();
if(count > 0){
//读取消息并转为String
body = new byte[count];
dips.read(body);
String message = new String(body,CSUtils.encode);
CSUtils.log(false,"接收数据:",message);
}
}
String result = "123";
body = result.getBytes(CSUtils.encode);
CSUtils.log(false,"发送数据:",new String(body));
dops.write(body);
}
if(CSUtils.SOCKETTYPE == CSUtils.SOCKETO)
//ObjectOutputStream/ObjectInputStream
{
try {
ObjectOutputStream dops = new ObjectOutputStream(os);
ObjectInputStream dips = new ObjectInputStream(is);
//读取消息并转为String
Object o = dips.readObject();
CSUtils.log(false,"接收数据:",(String)o);
String result = "123";
CSUtils.log(false,"发送数据:",result);
dops.writeObject(result);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
//数据传输关闭连接
if(socket!=null){
try{
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Service server = new Service();
server.startServer();
}
}
配置类
public class CSUtils {
static String ip = "127.0.0.1";
static int port = 12345;
static String encode = "GBK";
static int SOCKETTYPE = 1;
static int SOCKETS = 1;
static int SOCKETD = 2;
static int SOCKETO = 3;
static void log(Boolean cos, String... vs){
StringBuffer sb = new StringBuffer();
if(cos)
sb.append("客户端->");
else
sb.append("服务端->");
for (String string : vs) {
sb.append(string);
}
System.out.println(sb.toString());
}
}
网友评论