Socket通信

 

                                                    Socket通信――服务器和客户端

    在Java中,有两个类和Socket通信有关:java.net.ServerSocket/java.net.Socket,这两个类用于建立一个双向的通信。ServerScoket用于建立等待来自客户端访问的“服务器“,而Socket用于表示网络间的通信。下面分别说一下ServerSocketSocket的一些主要知识。

Serversocket

    要建立一个Socket通信应用,首先需要建立一个服务器端的应用。在Java中,有一个类ServerSocket专门用于建立服务器的Socket应用。它并不主动建立连接,而只是打开一个端口等待客户端的连接。

ServerSocket(int port):用指定的端口port来创建一个侦听Socket

Socket accept():用于接收一个客户机的连接。如果有客户机连接到ServerSocket所创建的侦听端口,则返回一个Socket实例,否则,将一直等待。

void close():关闭Socket连接。

Socket

Socket(InetAddress address,int port):建立一个指定主机IP地址address,端口port上的Socket连接。

    下面通过简单的Socket通信的程序说明一下,并不断完善这个程序,看代码:

    首先是服务器端的代码:

import java.net.ServerSocket;

 

publicclass Server {

publicstaticvoid main(String[] args) throws Exception {

//创建端口号为8888的服务器

ServerSocket ss = new ServerSocket(8888);

System.out.println("*********服务器启动**********");

//用来接收客户机的连接

ss.accept();

System.out.println("一个客户端连接上了");

}

}

下面是客户端的代码:

import java.net.Socket;

 

publicclass Client {

publicstaticvoid main(String[] args) throws Exception{

System.out.println("******客户端启动*******");

//127.0.0.1是本机IP的地址,8888则是我们所连服务器的端口号

Socket snew Socket("127.0.0.1",8888);

}

}

执行结果:执行Server服务器端会显示*********服务器启动********** 

接着执行Client 客户端会显示******客户端启动******* 

同时服务器端会显示一个客户端连接上了

如果我们想让服务器对客户端说话,客户端也对服务器说,我们就需要使用流。下面看一下如何使用流来让服务器和客户端进行交流:

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

 

publicclass Server {

publicstaticvoid main(String[] args) throws Exception {

//创建端口号为8888的服务器

ServerSocket ss = new ServerSocket(8888);

System.out.println("*********服务器启动**********");

//用来接收客户机的连接

Socket s = ss.accept();

System.out.println("一个客户端连接上了");

//利用流向客户端说话

OutputStream os = s.getOutputStream();

PrintStream ps = new PrintStream(os);

ps.println("hello");

//接收客户端传来的话

InputStream is = s.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

System.out.println("客户端说:"+br.readLine());

//关闭资源

s.close();

ps.close();

br.close();

}

}

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.Socket;

 

publicclass Client {

publicstaticvoid main(String[] args) throws Exception{

System.out.println("******客户端启动*******");

//127.0.0.1是本机IP的地址,8888则是我们所连服务器的端口号

Socket s= new Socket("127.0.0.1",8888);

//客户端接收服务器传来的话并输出

InputStream is = s.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

System.out.println("服务器说:"+br.readLine());

//客户端向服务器说话

OutputStream os = s.getOutputStream();

PrintStream ps = new PrintStream(os);

ps.println("hello too");

//关闭资源

s.close();

br.close();

ps.close();

}

}

执行结果:服务器端:*********服务器启动**********

一个客户端连接上了

客户端说:hello too

客户端:******客户端启动*******

服务器说:hello

说明:这是我们本机上传输,如果我们想向别的机器传输,那么我们只需要把客户端连接的本机IP改成对方的IP同时端口号也要对应对方设置的端口号,这样就实现了。

现在传输的内容是我们设定好的,如果我们想自己输入想说的话,这样就像一个简易的QQ一样。我们需要用到输入语句同时还得用到死循环,因为我们不止说一句。下面看一下具体的代码:

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.Scanner;

 

publicclass Server {

publicstaticvoid main(String[] args) throws Exception {

//创建端口号为8888的服务器

ServerSocket ss = new ServerSocket(8888);

System.out.println("*********服务器启动**********");

//用来接收客户机的连接

Socket s = ss.accept();

System.out.println("一个客户端连接上了");

//利用流向客户端说话

OutputStream os = s.getOutputStream();

PrintStream ps = new PrintStream(os);

//接收客户端传来的话

InputStream is = s.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

Scanner scan = new Scanner(System.in);

boolean flag = true;

while(flag){//如果直接写成while(true)编译时会报错,这样写可以骗过编译器

ps.println(scan.next());

System.out.println("客户端说:"+br.readLine());

}

//关闭资源

s.close();

ps.close();

br.close();

}

}

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.PrintStream;

import java.net.Socket;

import java.util.Scanner;

 

publicclass Client {

publicstaticvoid main(String[] args) throws Exception{

System.out.println("******客户端启动*******");

//127.0.0.1是本机IP的地址,8888则是我们所连服务器的端口号

Socket s= new Socket("127.0.0.1",8888);

//客户端接收服务器传来的话并输出

InputStream is = s.getInputStream();

BufferedReader br = new BufferedReader(new InputStreamReader(is));

//客户端向服务器说话

OutputStream os = s.getOutputStream();

PrintStream ps = new PrintStream(os);

Scanner scan = new Scanner(System.in);

boolean flag = true;

while(flag){

System.out.println("服务器说:"+br.readLine());

ps.println(scan.next());

}

//关闭资源

s.close();

br.close();

ps.close();

}

}

这样执行之后我们就可以自己输入自己想说的话了,如果把IP改了,就可以实现两台电脑之间的通信了,就像一个简单的QQ一样,大家可以尝试一下。

 

你可能感兴趣的:(java,socket,服务器,客户端,客户机)