Socket:
两个java应用程序可通过一个双向的网络通信连续实现数据交换,这个双向链路的一端称为一个Socket。
Socket通常用来实现client-server连接。
Java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端(像qq那样,互相通信)。
建立连接时所需要的寻址信息为远程计算机的IP地址和端口号(port number)。
TCPSocket模型:
过程:
一个Server端多个Client端:
一端和另一段说话一端说一端听:
server端:
import java.net.*;
//一端和另外一端说话,一端说一端听。
/* 1 java Socket编程步骤。
* 2 Socket/ServerSocker类用法。
* 3 通过Socket对象可以获取通信对方Socket的信息。
*
*/
import java.io.*;
public class TestServer
{
public static void main(String[] args)
{
try
{
//在服务器端建立自己的一个插座口。
ServerSocket s = new ServerSocket(8888);
while(true)
{
//接受来自客户端的请求。
Socket s1 = s.accept();
//写入到Client的管道(流)
OutputStream os = s1.getOutputStream();
//在管道上加上一层保障。也就是形成双层管道。
DataOutputStream dos = new DataOutputStream(os);
//和客户端通话,写入到客户端。
//字符串hello ip地址,端口号。
//客户端这样可以从服务器端读出了。
dos.writeUTF("Hello" + s1.getInetAddress() + "port#" + s1.getPort()+ " bye-bye!");
dos.close();
s1.close();
}
}
catch(IOException e)
{
e.printStackTrace();
System.out.println("程序运行出错:" + e);
}
}
}
getInetAddress()得到ip地址的超集,包含ip地址也可以包括其他的地址。
.getPort() 得到端口号。
server端写入到client端。
Client端:
Client端从server端读取:
import java.net.*;
import java.io.*;
/*1 java Socket编程。
*2 Socket/ServerSocket类用法。
*3 通过Socket对象可以获取通信对方Socket信息。
*/
public class TCPClient
{
public static void main(String[] args)
{
try
{
//建立客户端的那个“插座接口”,并且通过构造方法和服务器端的那个接口相连接。
Socket s1 = new Socket("127.0.0.1",8888);
//读来自服务器端的数据流。
InputStream is = s1.getInputStream();
//DataInputStream 需要套接在InputStream上。
DataInputSteam dis = new DataInputStream(is);
//进行读出来自服务器端的数据流。通过UTF编码读出。
System.out.println(dis.readUTF());
//关闭管道。
dis.close();
//关闭socket接口通信。
s1.close();
}catch(ConnectException connExc)//捕捉到不同的异常进行不同的处理。
{
connExc.printStackTrace();
System.err.println("服务器链接失败!");
}catch(IOException e)
{
e.printStackTrace():
}
}
}
结果如下:
接通后两端都说都听:
server端:
import java.net.*;
//两端都说两端都听,但是要有顺序,这和当时的传呼机感觉类似。
/* 1 java Socket编程步骤。
* 2 Socket/ServerSocker类用法。
* 3 通过Socket对象可以获取通信对方Socket的信息。
*
*/
import java.io.*;
public class TestSocketServer
{
public static void main(String[] args)
{
InputStream in = null;
OutputStream out = null;
try
{
//在服务器端建立自己的一个插座口。
ServerSocket ss = new ServerSocket(5888);
//接受来自客户端的请求。
Socket socket = ss.accept();
//得到来自客户端写入的数据。
in = socket.getInputStream();
//服务器端输出流对象。
out = socket.getOutputStream();
//捆绑在两个管子上的传输管。
DataOutputStream dos = new DataOutputStream(out);
DataInputStream dis = new DataInputStream(in);
//定义从客户端读出的字符串。
String s = null
//如果读出的不为空的话。向客户单发出本机的ip地址和连接的端口号。
if((s=dis.readUTF())!=null)
{
System.out.println(s);
System.out.println("from:" +socket.getInetAddress());
System.out.println("port: " + socket.getPort());
}
//向客户端写入。
dos.writeUTF("hi,hello");
//关闭流对象。
dis.close();
dos.close();
socket.close();
}
catch(IOException e)
{
e.printStackTrace();
System.out.println("程序运行出错:" + e);
}
}
}
Client端:
import java.net.*;
import java.io.*;
/*1 java Socket编程。
*2 Socket/ServerSocket类用法。
*3 通过Socket对象可以获取通信对方Socket信息。
*/
public class TestSocketClient
{
public static void main(String[] args)
{
InputStream is = null;
OutputStream os = null;
try
{
//建立客户端的那个“插座接口”,并且通过构造方法和服务器端的那个接口相连接。
Socket socket = new Socket("localhost",5888);
is = socket.getInputStream();
os = socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
//写入.
dos.writeUTF("hey");
String s = null;
if((s=dis.readUTF())!=null)
{
System.out.println(s);
}
dos.close();
dis.close();
socket.close();
}catch(UnknownHostException e)//捕捉到不同的异常进行不同的处理。
{
e.printStackTrace();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
点对点的通信:
就像qq那样同时可以说同时可以听,可以一边说一边听,像打电话一样。
就不在这里列出了。