Java Socket编程如何建立两者关系
事实上网络编程简单的理解就是两台计算机相互通讯数据而已.对于程序员而言,去掌握一种编程接口并使用一种编程模型相对就会显得简单的多了.Java SDK提供一些相对简单的Api来完成这些工作.Java Socket编程就是其中之一.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以准备网络编程了.
网络编程的基本模型就是客户机到服务器模型.简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置,而另一个则只需要知道这个固定的位置.并去建立两者之间的联系..然后完成数据的通讯就可以了.这里提供固定位置的通常称为服务器,而建立联系的通常叫做客户端.基于这个简单的模型,就可以进入网络编程啦.
Java对这个模型的支持有很多种Api.而这里我只想介绍有关Java Socket编程的编程接口.对于Java而言已经简化了Socket的编程接口.首先我们来讨论有关提供固定位置的服务方是如何建立的.Java提供了ServerSocket来对其进行支持.事实上当你创建该类的一个实力对象并提供一个端口资源你就建立了一个固定位置可以让其他计算机来访问你.ServerSocket server=new ServerSocket(6789);这里稍微要注意的是端口的分配必须是唯一的.因为端口是为了唯一标识每台计算机唯一服务的.另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的.好了.
我们有了固定位置.现在所需要的就是一根连接线了.该连接线由客户方首先提出要求.因此Java同样提供了一个Java Socket编程对象来对其进行支持.只要客户方创建一个Socket的实例对象进行支持就可以了.Socket client=new Socket(InetAddress.getLocalHost(),5678);客户机必须知道有关服务器的IP地址.对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供.它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法.
好了.上面的方法基本可以建立一条连线让两台计算机相互交流了.可是数据是如何传输的呢?事实上I/O操作总是和网络编程息息相关的.因为底层的网络是继续数据的.除非远程调用,处理问题的核心在执行上.否则数据的交互还是依赖于IO操作的.所以你也必须导入java.io这个包.java的IO操作也不复杂.它提供了针对于字节流和Unicode的读者和写者,然后也提供了一个缓冲用于数据的读写.
- BufferedReader in=new BufferedReader(new InputStream
Reader(server.getInputStream())); - PrintWriter out=new PrintWriter(server.getOutputStream());
上面两句就是建立缓冲并把原始的字节流转变为Unicode可以操作.而原始的字节流来源于Java Socket编程的两个方法.getInputStream()和getOutputStream()方.分别用来得到输入和输出.那么现在有了基本的模型和基本的操作工具.我们可以做一个简单的Socket例程了.
服务方:
- import java.io.*;
- import java.net.*;
- public class MyServer {
- public static void main(String[] args) throws IOException{
- ServerSocket server=new ServerSocket(5678);
- Socket client=server.accept();
- BufferedReader in=new BufferedReader(new InputStreamReader
(client.getInputStream())); - PrintWriter out=new PrintWriter(client.getOutputStream());
- while(true){
- String str=in.readLine();
- System.out.println(str);
- out.println("has receive....");
- out.flush();
- if(str.equals("end"))
- break;
- }
- client.close();
- }
- }
这个Java Socket编程的主要目的在于服务器不断接收客户机所写入的信息只到.客户机发送"End"字符串就退出程序.并且服务器也会做出"Receive"为回应.告知客户机已接收到消息。
Socket通信读取有不少需要我们注意的知识点。当我们在使用的时候有很多的问题摆在我们面前。下面我们就来详细的学习有关Java Socket通信读取的相关代码编写。
以下是Java Socket通信读取的相关代码。
- import java.io.BufferedReader;
- import java.io.BufferedWriter;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.InputStreamReader;
- import java.net.URL;public class URLReader {
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- // 声明抛出所有例外
- URL tirc = new URL(http://www.sina.com);
- File writeFile = new File("d:\\style_1.html");
- // 构建一URL对象14100
- BufferedReader in = new BufferedReader(new InputStreamReader(tirc.openStream()));
- BufferedWriter bos = new BufferedWriter(new FileWriter(writeFile));
- //byte[] b=new byte[4096];
- String inputLine;
- // 使用openStream得到一输入流并由此构造一个BufferedReader对象
- while ((ininputLine = in.readLine()) != null){
- bos.write(inputLine);
- System.out.println(inputLine);
- }
- bos.flush();
- in.close();
- bos.close();
- }
- }
这就是传说中的Java Socket通信读取相关代码的介绍。
Java Socket线程我们经常会用到的技术,但是有很多程序员还是有不少的使用问题,下面我们就看看如何才能进行有关的代码编写,希望大家又说收获。网络的伟大之一也是信息共享,Server可以主动向所有Client广播消息,同时Client也可以向其它Client发布消息。
下面看看如何开发一个可以实时传递消息的程序。
Java Socket线程的设计原理:
服务器端接受客户端的连接请求,同时启动一个线程处理这个连接,线程不停的读取客户端输入,然后把输入加入队列中,等候处理。在线程启动的同时将线程加入队列中,以便在需要的时候定位和取出。
{源码}
- import java.io.*;
- import java.net.*;
- import java.util.*;
- import java.lang.*;
- public class Server extends ServerSocket
- {
- private static ArrayList User_List = new ArrayList();
- private static ArrayList Threader = new ArrayList();
- private static LinkedList Message_Array = new LinkedList();
- private static int Thread_Counter = 0;
- private static boolean isClear = true;
- protected static final int SERVER_PORT = 10000;
- protected FileOutputStream LOG_FILE = new FileOutputStream("d:/connect.log", true);
- public Server() throws FileNotFoundException, IOException
- {
- super(SERVER_PORT);
- new Broadcast();
- //append connection log
- Calendar now = Calendar.getInstance();
- String str = "[" + now.getTime().toString() + "] Accepted a connection1512";
- byte[] tmp = str.getBytes();
- LOG_FILE.write(tmp);
- try
- {
- while (true)
- {
- Socket socket = accept();
- new CreateServerThread(socket);
- }
- }
- finally
- {
- close();
- }
- }
- public static void main(String[] args) throws IOException
- {
- new Server();
- }
- //--- Broadcast
- class Broadcast extends Thread
- {
- public Broadcast()
- {
- start();
- }
- public void run()
- {
- while (true)
- {
- if (!isClear)
- {
- String tmp = (String)Message_Array.getFirst();
- for (int i = 0; i < Threader.size(); i++)
- {
- CreateServerThread client = (CreateServerThread)Threader.get(i);
- client.sendMessage(tmp);
- }
- Message_Array.removeFirst();
- isClear = Message_Array.size() > 0 ? false : true;
- }
- }
- }
- }
- //--- CreateServerThread
- class CreateServerThread extends Thread
- {
- private Socket client;
- private BufferedReader in;
- private PrintWriter out;
- private String Username;
- public CreateServerThread(Socket s) throws IOException
- {
- client = s;
- in = new BufferedReader(new InputStreamReader(client.getInputStream()));
- out = new PrintWriter(client.getOutputStream(), true);
- out.println("--- Welcome to this chatroom ---");
- out.println("Input your nickname:");
- start();
- }
- public void sendMessage(String msg)
- {
- out.println(msg);
- }
- public void run()
- {
- try
- {
- int flag = 0;
- Thread_Counter++;
- String line = in.readLine();
- while (!line.equals("bye"))
- {
- if (line.equals("l"))
- {
- out.println(listOnlineUsers());
- line = in.readLine();
- continue;
- }
- if (flag++ == 0)
- {
- Username = line;
- User_List.add(Username);
- out.println(listOnlineUsers());
- Threader.add(this);
- pushMessage("[< " + Username + " come on in >]");
- }
- else
- {
- pushMessage("<" + Username + ">" + line);
- }
- line = in.readLine();
- }
- out.println("--- See you, bye! ---");
- client.close();
- }
- catch (IOException e)
- {}
- finally
- {
- try
- {
- client.close();
- }
- catch (IOException e)
- {}
- Thread_Counter--;
- Threader.remove(this);
- User_List.remove(Username);
- pushMessage("[< " + Username + " left>]");
- }
- }
- private String listOnlineUsers()
- {
- String s ="-+- Online list -+-1512";
- for (int i = 0; i < User_List.size(); i++)
- {
- s += "[" + User_List.get(i) + "]1512";
- }
- s += "-+---------------------+-";
- return s;
- }
- private void pushMessage(String msg)
- {
- Message_Array.addLast(msg);
- isClear = false;
- }
- }
- }
以上就是对Java Socket线程的详细介绍。这就是程序运行后,多用户登陆并且输入信息后的屏幕。实现了信息的实时广播。用户输入"l"就可以列出在线人员表。
文章来源: aaaedu.blog.csdn.net,作者:tea_year,版权归原作者所有,如需转载,请联系作者。
原文链接:aaaedu.blog.csdn.net/article/details/88093633
- 点赞
- 收藏
- 关注作者
评论(0)