Socket是网络编程的接口,它抽象成线程之间的接口。两个线程,不管它的操作系统,不管它的硬件,只要有Socket接口,在同一主机中或者在不同的主机中都能通信。我们见到的大大小小的网络程序大多都是通过Socket实现的,比如游戏服务器,ftp服务器,浏览器等。所以理解Socket编程,是网络编程的的必修课。在本篇文章中我们将讲到用Socket实现简单的服务端与客户端互相传送纯文本的例子。
在Socket编程中一端作为服务端,一端作为客户端才能通信。
服务端与客户端的区别:服务端要与它连接的所有客户端通信,而客户端只与指定的一个服务端通信。
在通信前,服务端先指定一个端口,然后就可以等待客户端的连接。
客户端要想连接上服务端,必须知道服务端的ip地址和端口,ip地址指明了服务端的位置,而端口指明了是哪一个服务端。
当客户端与服务端连接上之后,如何通信呢。在服务端,要想给客户端传输数据,就先得到客户端的实例,然后对该实例进行IO操作,就相当与操作自己的文件系统一样,非常的方便,所以说Socket是抽象的概念,把数据传输抽象成数据的读写。当服务端对客户端的实例进行写的操作时客户端就可以收到服务端写的数据;当客户端对服务端的实例进行写的操作时,服务端就能收到客户端传输过来的数据;
在Java中服务端中:
ServerSocket(int port)构造函数绑定一个端口。
Socket accept() 方法监听客户端的连接,该方法返回一个Socket对象。
在Java中客户端中:
Socket(InetAddress address, int port)构造函数构造一个socket对象。
connect(SocketAddress endpoint) 连接到服务端。
服务端:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
runServer();
}
private static void runServer() throws IOException {
ServerSocket ss=new ServerSocket(3574);//服务端监听3574这个端口
Socket s=ss.accept();//服务端接受客户端的连接
System.out.println(s.getLocalSocketAddress().toString());
InputStream in=s.getInputStream();//得到客户端的输入流,为了得到客户端传来的数据
OutputStream out =s.getOutputStream();//得到客户端的输出流,为了向客户端输出数据
BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(in));
PrintWriter bufferedWriter=new PrintWriter(out,true);
while (true) {
String line=null;
bufferedWriter.println(new Date()+",Hello,I'm Server!");//向客户端输出数据
line=bufferedReader.readLine();//读取客户端传来的数据
if(line==null)
break;
System.out.println("客户端说:"+line);//打印客户端传来的数据
}
}
}
客户端:
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.io.*;
import java.util.*;
import java.net.*;
public class Main
{
public static void main(String[] args) throws UnknownHostException, IOException
{
runSocket();
}
private static void runSocket() throws IOException
{
final String HOST="192.168.1.100";
//final String HOST="127.0.0.1";
Socket socket = new Socket(HOST, 3574);//创建一个客户端连接
OutputStream out = socket.getOutputStream();//获取服务端的输出流,为了向服务端输出数据
InputStream in=socket.getInputStream();//获取服务端的输入流,为了获取服务端输入的数据
PrintWriter bufw=new PrintWriter(out,true);
BufferedReader bufr=new BufferedReader(new InputStreamReader(in));
while (true)
{
String line=null;
line=bufr.readLine();//读取服务端传来的数据
if(line==null)
break;
System.out.println("服务端说:"+line);//打印服务端传来的数据
bufw.println((new Date()) + ",Hello,I am Client!");//发送数据给服务端
}
}
}
转载自:https://blog.csdn.net/e_one/article/details/51620620