您的位置:首页 > 编程语言 > Java开发

Java套接字

2015-08-15 20:03 537 查看
前言: 

  本文补充一下Java关于套接字方面的内容,因为其应用相对比较简单,所以下面介绍两个程序实例。

---------------------------------------------------------------------------------------

1.Socket对接过程





(注:这是之前在网上见过一张图片,大致过程还是比较清晰的)

分析:

Socket对接之后的数据传送类似于文件的读写;

流套接字采用TCP传输数据流,一旦数据发送失败将重传,所以具有安全无损的特点。

2.实例一【Server->Client(1:1)】

package socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class Server {

public Server(){
try {
//服务端开启端口8000
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("server start at:"+new Date());
//等待客户端相应
Socket socket  = serverSocket.accept();
InetAddress address = socket.getInetAddress();
System.out.println("connected with address:"+address.getHostAddress());
DataInputStream input = new DataInputStream(socket.getInputStream());
DataOutputStream output = new DataOutputStream(socket.getOutputStream());

//while(true){
int num = input.readInt();
System.out.println(num);
//}

} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
new Server();
}

}


package socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

public class Client {
public static void main(String[] args) throws Exception {

System.out.println("--client--");

//Socket(,)内参数分别设为服务端IP和端口
Socket socket = new Socket("localhost", 8000);

DataInputStream input = new DataInputStream(socket.getInputStream());
DataOutputStream output = new DataOutputStream(socket.getOutputStream());

int x = 222;
output.writeInt(x);
System.out.println("data convented:"+x);
}
}


服务端输出(执行之后显示红点,表示等待中...):



server start at:Sat Aug 15 19:39:40 CST 2015
connected with address:127.0.0.1
222


客户端输出:

--client--
data convented:222


3.实例二【Server->Client(1:n)】

package socket;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;

public class SuperServer {
private int countOfClient=0;
public SuperServer() {
try {
ServerSocket serverSocket = new ServerSocket(8000);
System.out.println("server start at:" + new Date());

while (true) {
Socket socket = serverSocket.accept();
InetAddress address = socket.getInetAddress();
System.out.println("connected with address:"
+ address.getHostAddress());
//为每一位Client创建一个单独的线程
new Thread(new ConnectTask(socket)).start();
countOfClient++;
System.out.println("this is the "+countOfClient + "(th) of client. ");
}
} catch (Exception e) {
e.printStackTrace();
}

}

public static void main(String[] args) {
new SuperServer();
}

class ConnectTask implements Runnable {
private Socket socket = null;

public ConnectTask(Socket socket) {
this.socket = socket;
}

@Override
public void run() {
try {
DataInputStream input = new DataInputStream(
socket.getInputStream());
DataOutputStream output = new DataOutputStream(
socket.getOutputStream());

int numFromClient = input.readInt();
System.out.println("number from client:"+numFromClient);
} catch (Exception e) {
e.printStackTrace();
}
}

}

}


  以上代码中,服务端创建多线程,给每一个对接的客户端分一个独立的线程;客户端代码不变,还是实例一的代码。程序输出跟实例一近似,只不过这是服务端一直运行着,可供多个客户端连接。(因为独立分配线程,程序运行时资源比较浪费,所以代码仅供参考,有待优化!)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: