Java Socket通信
通过Java Socket 实现网络通信,java socket 在java.net 包中,实现通信首先有一个服务端和一个客户端。
开始之前我们先了解一下端口号,TCP /IP的基本知识。
端口号的知识:端口号用来区分计算机不同的服务,范围为TCP/IP协议中的服务端口,端口号的范围从0到65535,0到1023为系统保留的端口号,我们设置端口号的时候要设置1023之后的端口号。
TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议.
IP 是互联网协议
Java socket 就是基于TCP/IP网络通信,java socket 通信至少需要一个客户端Socket和一个服务端ServerSocket;
Socket 连接的一般流程图:
服务端的输入流就是客户端的输出流,服务的输出流就是客户端的输入流
实现一个客户端和服务端(电脑端)的简单通信功能:
客户端:
Socket客户端的创建过程:
1.创建Socket,指定服务器IP和端口,进行连接
2.创建连接后,获取Socket 的输入流读取服务发送的消息。
3.通过输出向服务发送消息
4.关闭输入输出流,关闭socket。
代码实现:
public class ClientSocket {
private Socket mSocket;
private String Ip=”127.0.0.1”;
private DataInputStream input=null;
private DataOutputStream output=null;
private static Scanner mScanner=null;
public static void main(String[] args) {
// TODO Auto-generated method stub
ClientSocket client=new ClientSocket();
client.connectServer();
// new ClientSocket().connectServer();
mScanner=new Scanner(System.in);
client.sentMessage();
}
public void sentMessage(){
while (true) {
String msg=mScanner.nextLine();
try {
output.writeUTF(msg);
output.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("IOException:"+e);
e.printStackTrace();
}
}
}
public void connectServer(){
mSocket=new Socket();
System.out.println("连接服务器。。。。。。:");
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
mSocket.connect(new InetSocketAddress(Ip, 4560), 40000);
output=new DataOutputStream(mSocket.getOutputStream());
output.writeUTF("你好我是客户端请求连接!!!");
output.flush();
input=new DataInputStream(mSocket.getInputStream());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// int len=0;
while (true) {
try {
int len=0;
byte[] bt=new byte[1024*4];
while((len=input.read(bt))!=-1){
String str=new String(bt,”UTF-8”);
System.out.println(“服务器说:”+str);
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
/**
*
* 断开连接
* home-no110
* 上午8:55:41
* void
*/
public void disconnect() {
try {
output.close();
input.close();
mSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
服务端:
ServeSocket 创建过程
1.创建ServerSocket,并指定ServerSocket端口号
2.通过accept()方法侦听并接受到此套接字的连接
3.收到客户端的连接后,通过输入流读取客户端发送的消息
4.通过输出流向客户端发送消息
5.关闭相应资源,输入输出流,Socket,ServerSocket
代码实现 :
public class ServerDemo {
private static ServerSocket mServerSocket;
private static DataInputStream input=null;
private static DataOutputStream output=null;
private static Scanner mScanner;
public static void main(String[] args) {
// TODO Auto-generated method stub
ServerDemo service=new ServerDemo();
service.startServer();
mScanner=new Scanner(System.in);
service.sendMessage();
}
/**
*
*
* home-no110
* 下午10:11:02
* void
*/
public void sendMessage(){
while(true){
String msg=mScanner.nextLine();
if(output!=null){
try {
output.writeUTF(msg);
output.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("IOException:"+e);
e.printStackTrace();
}
}
}
}
public void startServer(){
new Thread(new Runnable() {
@Override
public void run() {
try {
mServerSocket=new ServerSocket(4560);
while (true) {
System.out.println("等待客户端器连接");
Socket mSocket=mServerSocket.accept();
ServerThread mThread=new ServerThread(mSocket);
mThread.start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
private class ServerThread extends Thread{
private Socket mSocket;
public ServerThread(Socket mSocket) {
super();
this.mSocket = mSocket;
}
@Override
public void run() {
// TODO Auto-generated method stub
super.run();
try {
input=new DataInputStream(mSocket.getInputStream());
output=new DataOutputStream(mSocket.getOutputStream());
output.writeUTF("服务器启动");
output.flush();
byte [] bt=new byte[1024*4];
while((true)){
int len=0;
while((len=input.read(bt))!=-1){
String str=new String(bt, "UTF-8");
System.out.println("客户端说:"+str);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
input.close();
output.close();
mSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
到这里一个简短的socket通信就完成了。