Java 服务器与客户端的简单连接

今天刚学了一点socket,写了一个服务器与客户端的简单连接

利用的主要就是socket建立连接,发送数据

以下几个方法要注意:

  1. Socket(InetAddress  address, int  port); //创建一个流套接字并将其连接到指定 IP 地址的指定端口号。(本篇采用这个方法)
  2. Socket(String  host,  int  port);              //创建一个流套接字并将其连接到指定主机上的指定端口号。
  3. getInputStream();    // 获得网络输入流
  4. getOutputStream();    // 获得网络输出流
  5. close();        // 关闭Socket连接

 再来,要明白一些原理性的问题:即     对于客户端和服务器而言,输入流或输出流是相对的

 直接上图:

Java 服务器与客户端的简单连接_第1张图片

好了,介绍完这些,就可以先写客户端了。

ps:因为服务器端涉及到专门的ServerSocket类,所以后面再说,二者是相通的,写完一个,另一个水到渠成

因为服务器客户端分开运行,涉及到两个线程的问题

所以先建立一个ClientThread类,实现implements接口,重写run方法即可

package Chap2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class ClientThread implements Runnable {

	@Override
	public void run() {
		try {
			while(true) {
				Scanner s=new Scanner(System.in);
				
				//output
				String temp = s.nextLine();
				Socket socket = new Socket("127.0.0.1", 8886);
				OutputStream os = socket.getOutputStream();
				os.write(temp.getBytes());
				os.flush();
				
				//input
				InputStream is = socket.getInputStream();
				byte[] cache=new byte[1024];
				is.read(cache);
				System.out.println("The client has received the data :"+new String(cache));
				
				os.close();
				socket.close();
				if(temp.equals("end"))
					break;
			}
		}catch(Exception e) {
			e.printStackTrace();
		}

	}

}

客户端完成

接下来简单介绍一下用于编写服务器端的ServerSocket类

ServerSocket类:服务器端套接字类。监听服务器指定端口,接收客户端连接请求

注意一下几种方法:

  1. ServerSocket(int  port)
  2. accept();    // 用于产生“阻塞”,直到接收一个连接,返回客户端Socket对象,这个是关键,即服务器需要等待用户信息
  3. close();    // 关闭服务器端Socket监听

 

package Chap2;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerThread implements Runnable {

	@Override
	public void run() {
		try {
			while (true) {
				//input
				Scanner s = new Scanner(System.in);
				ServerSocket serverSocket = new ServerSocket(8886);
				System.out.println("server is listening……");
				Socket socket = serverSocket.accept();
				System.out.println("It's blocked just now.");
				InputStream is = socket.getInputStream();
				byte[] cache = new byte[1024];
				is.read(cache);
				System.out.println("The server has recevied the data:" + new String(cache));

				//output
				OutputStream os = socket.getOutputStream();
				System.out.println("The server will respond to the client:");
				String temp = s.nextLine();
				os.write(temp.getBytes());

				if (temp.equals("end"))
					break;

				os.flush();
				is.close();
				os.close();
				serverSocket.close();//如果不进行close操作,地址一直被占用控制台报错: Address already in use: JVM_Bind
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}

客户端,服务器端已经编写完毕,现在需要两个main方法来开辟两个线程并执行

package Chap2;

public class ServerTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Thread(new ServerThread()).start();
	}

}
package Chap2;

public class ClientTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new Thread(new ClientThread()).start();	
	}

}

 

运行后效果:

Java 服务器与客户端的简单连接_第2张图片Java 服务器与客户端的简单连接_第3张图片

你可能感兴趣的:(基础学习,网络编程,套接字,服务器客户端)