相关客户端,服务端,及接口:
客户端
package chat01
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
/**
*创建服务器
*写出数据:输入流
*读取数据:输出流
*
*输入流与输出流在同一个线程内应该彼此独立处理
* @author
*
*/
public class Client {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Socket client = new Socket("localhost",8888);
//控制台输入流
new Thread(new Send(client)).start();//一条路径
DataInputStream dis = new DataInputStream(client.getInputStream());
while(true) {
//输入流
String msg = dis.readUTF();
System.out.println(msg);
}
}
}
服务端
package chat01;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
*写出数据:输入流
*读取数据:输出流
* @author
*
*/
public class Server {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket server = new ServerSocket(8888);
Socket client = server.accept();
//写出数据
//输入流
DataInputStream dis = new DataInputStream(client.getInputStream());
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
while(true) {
String msg = dis.readUTF();
//输出流
dos.writeUTF("服务器已收到" + msg);
dos.flush();
}
}
}
/**
*一个客户端一条道路
*1.输入流
*2.输出流
*3.接收数据
*4.发送数据
* @author
*
*/
class MYChannel implements Runnable{
private DataInputStream dis;
private DataOutputStream dos;
private boolean isRunning = true;
public MYChannel(Socket client) {
try {
dis = new DataInputStream(client.getInputStream());
dos = new DataOutputStream(client.getOutputStream());
}catch(IOException e) {
closeUtil.closeAll(dis,dos);
isRunning = false;
}
private String receive() {
String msg = "";
try {
msg = dis.readUTF();
}catch(IOException e) {
closeUtil.closeAll(dis,dos);
isRunning = false;
}
return msg;
}
}
@Override
public void run() {
// TODO Auto-generated method stub
}
}
接收数据端
package chat01;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
/**
* 接收数据 线程
* @author
*
*/
public class Receive implements Runnable{
private DataInputStream dis;
private boolean isRunning = true;
public Receive() {
}
public Receive(Socket client) {
try {
dis = new DataInputStream(client.getInputStream());
}catch(IOException e) {
isRunning = false;
closeUtil.closeAll(dis);
}
}
/**
* 接收数据
*/
public String receive() {
String msg = "my";
try {
dis.readUTF();
} catch (IOException e) {
// TODO Auto-generated catch block
isRunning = false;
closeUtil.closeAll(dis);
}
return msg;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(isRunning) {
System.out.println(receive());
}
}
}
发送数据端
package chat01;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
/**
* 发送数据 线程
* @author
*
*/
public class Send implements Runnable{
//控制台输入流
private BufferedReader console;
//管道输出流
private DataOutputStream dos;
//控制线程
private boolean isRunning = true;
public Send() {
console = new BufferedReader(new InputStreamReader(System.in));
}
public Send(Socket client){
this();
try {
dos = new DataOutputStream(client.getOutputStream());
} catch (IOException e) {
// TODO Auto-generated catch block
isRunning = false;
closeUtil.closeAll(dos,console);
}
}
//从控制台接受数据
private String getMsgFromConsole() {
try {
return console.readLine();
}catch(IOException e) {
}
return "";
}
public void send() {
String msg = getMsgFromConsole();
try {
if(null != msg && !msg.equals("")) {
dos.writeUTF(msg);
dos.flush(); //强制刷新
}
}catch (IOException e) {
// TODO Auto-generated catch block
isRunning = false;
closeUtil.closeAll(dos,console);
}
}
@Override
public void run() {
// TODO Auto-generated method stub
while(isRunning) {
send();
}
}
}
关闭流的方法
package chat01;
import java.io.Closeable;
import java.io.IOException;
/**
* 关闭流的方法
* @author
*
*/
public class closeUtil {
public static void closeAll(Closeable...io) {
for(Closeable temp : io) {
if(null != temp) {
try {
temp.close();
} catch (IOException e) {
// TODO Auto-generated catch block
}
}
}
}
}