什么是socket?
两个进程要进行通讯的话只要唯一标识一个线程,在网络中,我们可以用利用ip地址+协议+端口号唯一标示网络中的一个进程。能够唯一标示网络中的进程后,它们就可以利用socket进行通信了,什么是socket呢?Socket(译作套接字)是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
什么是TCP编程:
TCP协议是面向连接的,可靠的,有序的,以字节流的方式发送数据,通过三次握手方式建立连接,形成传输数据管道,在连接中进行大量数据的传输,效率会稍低。
先补充点网络的知识:
TCP/IP协议参考模型把所有的TCP/IP系列协议归类到四个抽象层中:
那么加入Socket可以看成下图这样:
现在就来讲一下如何用java来写一个简单的TCP通信:
图解:
Socket是配对的,就像管道的两端,就像客户端要把一条管子伸向服务器端,然后服务器端接着,两者建立了连接,并且Socket自带IO流,提供了字节流,两端的Socket都有输入输出流,就像管子里面也有两条专门的管道,一条管道是:客户端的用OutputStream对应服务器端用InputStream让信息从服务器端流到客户端,另一条是服务器端的OutputStream对应服务器端的InputStream让信息从客户端流到服务器端。并且IO中呈序列化部分,一个进一个出,按顺序来。
下面是代码实现:
服务器端:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* @author Clark Xu 服务器端:接收信息
*
*/
public class MyServer {
/**
* @param args
*/
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(8000);//一个专门用来建立Socket服务器的类,可以用服务器需要使用的端口号作为参数来创建服务器对象。监听,等待连接,一旦有client端连接便创建socket实例.然后通过socket交互数据.
System.out.println("监听前……");
Socket s = ss.accept();//这一方法可以说是阻塞式的,没有client端连接就一直监听着,等待连接.直到有client端连接进来才通过socket实例与client端进行交互,一个server端可以被多个client端连接,每连接一次都会创建一个socket实例,派发服务线程.
InputStream input = s.getInputStream();
OutputStream output = s.getOutputStream();
// 用StringBuffer中的追加的方式输出一句话来
while (true) {//一个StringBuffer对应一个#,一句句输出
String msg = "";
StringBuffer message = new StringBuffer(msg);
while (true) {
int data = input.read();
if (data == 35)
break;// #作为结束的标识
message.append((char) data);// 一个一个字符过来的,要累积在一起
}
System.out.println(message);
}
} catch (Exception e) {
// TODO: handle exception
}
}
}
客户端:
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
/**
* @author Clark Xu
* 客户端:发送功能
*
*/
public class MyClient {
/**
* @param args
*/
public static void main(String[] args) {
try {
Socket s = new Socket("127.0.0.1",8000);//套接字,放ip和端口
InputStream input = s.getInputStream();
OutputStream output = s.getOutputStream();
//input.read();
String msg1="iamxkj#";
String msg2="iloveBasketball";
output.write((msg1+"#").getBytes());//发送话的话用字节流
output.write((msg2+"#").getBytes());//发送第二句话
} catch (Exception e) {
// TODO: handle exception
}
}
}