第一、建立计算机两者之间的关系
java有很多的API支持网络编程,这里我们主要讲解Socket。其实java已经相当简化了网络编程模式。您不用太了解网络的协议和底层实现。(当然,有时间一定要研究一下)java提供ServerSocket类来支持。
当你ServerSocket serverSocket = new ServerSocket (8888)就已经建立了一个固定的位置可以让其它的计算机来访问你了。这里要稍微补充一下端口的支持,端口是为了唯一标识每台计算机唯一服务的,另外端口号是从0~65535之间的,前1024个端口已经被Tcp/Ip 作为保留端口,因此你所分配的端口只能是1024个之后的。好了,这样服务器端已经建立好了。接着我们开始建立客户端,java同样提供了Socket对象来支持,只要客户端创建了Socket client = new Socket(InetAddress.getLocalHost(),8888),
客户端必须知道服务器的地址,java提供了InetAddress.getLocalHost()静态方法来获得服务器地址。好了,到目前为止两台计算机之间的关系已经建立好了。
第二、数据的传输
网络编程和I/O总是分不开的,java提供了很好的流机制来方便我们对字节流和Unicode的读写。也提供了数据缓冲哦你的读写。
BufferedReader br=new BufferedReader(new InputStreamReader(serverSocket.getInputStrea()));
PrintWriter out=new PrintWriter(serverSocket.getOutputStream());
上面两行语句建立流缓冲并把原始字节流转换成Unicode来进行操作,而原始的字节流有Socket的getInputStream()和getOutputStream()两个方法来获得输入和输出。掌握了一些基本概念和操作的工具我们就可以做一个简单的例子了。
1、建立服务端
/**
* @author licheng
* @date 09-09-05
* @version 1.0
* @function 创建服务端
* */
package com.licheng.word.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
/**
* @param args
*/
public static void main(String[] args) throws IOException{
ServerSocket serverSocket = new ServerSocket(8888); //建立服务端固定地址
Socket client = serverSocket.accept(); //侦听并接受到此套接字的连接
BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
while (true) {
String str = br.readLine();
System.out.println(str);
out.println("read...");
out.flush();
if ("stop".equals(str)) { //如果客户端传来的是stop就终止它
break;
}
}
client.close(); //关闭套接字
}
}
2、建立客户端
/**
* @author licheng
* @date 09-09-05
* @version 1.0
* @function 创建客户端
* */
package com.licheng.word.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
public class Client {
private static Socket serverSocket;
public static void main(String[] args) throws IOException{
serverSocket = new Socket(InetAddress.getLocalHost(),8888); //获取服务器端的链接
BufferedReader in=new BufferedReader(new InputStreamReader(serverSocket.getInputStream()));
PrintWriter out=new PrintWriter(serverSocket.getOutputStream());
BufferedReader wt=new BufferedReader(new InputStreamReader(System.in));
while(true){
String str = wt.readLine();
out.println(str);
out.flush();
if(str.equals("stop")){
break;
}
System.out.println(in.readLine());
}
serverSocket.close();
}
}
客户机代码则是接受客户键盘输入,并把该信息输出,然后输出"stop"用来做退出标识。
这个程序只是简单的两台计算机之间的通讯.如果是多个客户同时访问一个服务器呢?你可以试着再运行一个客户端,结果是会抛出异常的.那么多个客户端如何实现呢?
我们来简单的分析一下,客户端和服务器就像一根线一样连接着,客户端和服务器端的主要通道就是Socket,服务器是通过accept()方法来同意是否连接客户端。那么这样我们就用多跟连线就可以解决这个问题了,程序改成如下
/**
* @author licheng
* @date 09-09-05
* @version 1.0
* @function 创建服务端
* */
package com.licheng.word.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
/**
* @param args
*/
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888); // 建立服务端固定地址
while (true) {
Socket client = serverSocket.accept(); // 侦听并接受到此套接字的连接
BufferedReader br = new BufferedReader(new InputStreamReader(client
.getInputStream()));
PrintWriter out = new PrintWriter(client.getOutputStream());
while (true) {
String str = br.readLine();
System.out.println(str);
out.println("read...");
out.flush();
if ("stop".equals(str)) { // 如果客户端传来的是stop就终止它
break;
}
}
client.close(); // 关闭套接字
}
}
}
这样我们就完成了多个用户的之间的交互。可是问题又来了,那么排队执行怎么办,没关系,我们再分析一下,也就是说当一个客户和服务器完成一次通讯之后下一个客户才可以进来和服务器交互.无法做到同时服务.那么要如何才能同时达到既能相互之间交流又能同时交流呢?很显然这是一个并行执行的问题了.这时候我们应该想到线程是最好的解决方案。
要创建线程要么直接继承Thread要么实现Runnable接口,然后把main函数里面的方法写到run里面就可以了。
/**
* @author licheng
* @date 09-09-05
* @version 1.0
* @function 创建服务端,线程安全
* */
package com.licheng.word.socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer extends Thread {
private Socket client;
public MyServer(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
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("read....");
out.flush();
if (str.equals("stop")) {
break;
}
}
client.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
/**
* @param args
*/
public static void main(String[] args) throws IOException {
ServerSocket server=new ServerSocket(8888);
while(true){
MyServer mu = new MyServer(server.accept());
mu.start();
}
}
分享到:
相关推荐
本资料包“linux-socket-C-S.rar”聚焦于C/S(客户端/服务器)架构下的Linux串口和Socket编程,为开发者提供了宝贵的资源。 串口通信是一种传统的通信方式,常用于设备间的短距离通信,如调试设备、数据采集等。在...
Python的Socket库是进行网络通信的基础模块,它允许程序员创建客户端和服务器端的连接,实现C-S(客户端-服务器)模型。在这个例子中,我们将深入探讨如何使用Python Socket实现一个多线程服务器来同时处理多个...
在本实验中,我们将关注"C-S Socket实验客户端",这里的C-S代表Client-Server模型,即客户端-服务器模型。客户端是发起通信请求的一方,而服务器则是接收并响应这些请求的一方。在这个实验中,我们将使用Socket API...
在这个"C-S Socket server"项目中,我们关注的是服务器端的实现,即服务端程序。Socket编程主要涉及客户端(Client)和服务器端(Server)之间的交互,采用客户-服务器(C/S)架构。下面将详细阐述Socket服务器的...
本项目"UnixSocket-Server-Client"涉及的知识点主要包括Unix套接字的工作原理、服务器和客户端的实现以及命令行参数的处理。 一、Unix套接字工作原理: Unix套接字有两种类型:流式(SOCK_STREAM)和数据报(SOCK_...
本项目通过 C 语言实现了一个基于 Linux 的异步聊天服务器,主要利用了 Socket 和 Select 机制。Socket 是网络编程的基础,而 Select 是一种多路复用技术,可以同时监听多个 Socket 的状态变化。这使得服务器能够...
在本文中,我们将深入探讨如何在Win32平台上利用C++和Socket技术构建一个C/S架构的聊天应用程序,实现客户端间的群聊和私聊功能。首先,我们需要了解几个关键概念和关键技术。 1. **Win32 API**:Windows操作系统...
本教程将探讨如何在Linux环境下使用C语言编写TCP socket的客户端和服务器程序。TCP是一种面向连接的、可靠的传输协议,它确保了数据包按顺序发送且无丢失。 首先,我们来理解TCP套接字的基本概念。套接字是进程间的...
本示例将探讨如何使用Java语言来构建一个基于C/S(客户端/服务器)架构的系统,通过Socket进行通信。 首先,我们要了解C/S架构。C/S(Client/Server)架构是一种常见的网络应用程序模型,其中客户端(Client)发起...
C-S聊天室源代码是一种基于Socket编程实现的网络通信程序,它主要由客户端(Client)和服务器端(Server)两部分组成。在这个项目中,Socket是客户端和服务器之间进行数据交换的基础工具,它允许两者之间建立连接并...
5. **CommunicationLayer.Lib**: 这个文件名可能是项目的静态库或动态库文件,包含了实现C/S通信层的代码。在C++项目中,库文件通常包含预编译的代码模块,可以直接被其他程序链接和使用,简化了开发流程。 6. **...
Java_C-S聊天程序是基于Socket通信技术实现的一种网络应用程序,它允许客户端(C)与服务器端(S)进行实时的数据交换。在这个项目中,我们主要关注的是如何利用Socket编程来构建一个点对点(P2P)以及点对多(P2M)...
包含C语言完整的socket简单c/s通信代码,有tcp连接的,也有UDP连接的,有多线程实现还有单线程实现,可供比较。还有domain socket c/s通信简单应用的完整代码 C语言 socket tcp/ip domain socket 代码
下面我们将通过一个简单的示例来说明如何使用libevent实现Socket服务器的异步编程。 ##### 1. 安装libevent ```bash wget http://monkey.org/~provos/libevent-1.4.13-stable.tar.gz tar -xzvf libevent-1.4.13-...
总结,Linux下的Socket网络编程涉及了从创建Socket到数据传输的全过程,理解并掌握这些基础知识是实现跨平台网络通信的关键。通过C语言,我们可以构建出稳定且高效的网络服务程序。在实践中,不断优化和调试,提升...
在Linux环境下,TCP Socket被广泛用于实现可靠的数据传输,如文件传输。本篇将深入探讨TCP Socket在Linux下的文件传输实现,并基于描述中的内容进行详细解释。 首先,TCP(Transmission Control Protocol)是一种...
### Socket通信C/S模型C语言实现详解 #### 一、概述 本文主要介绍了一段用C语言实现的基于TCP/IP协议的Socket通信程序,其中包括客户端(client)和服务端(server)两个部分。该程序能够实现基本的文件传输功能以及大...
本篇将详细探讨如何使用C语言实现socket服务端和客户端。 首先,我们要了解socket是什么。Socket是网络通信的一种接口,它允许两台计算机通过网络进行数据交换。在C语言中,我们通常使用套接字库(通常为`<sys/...
总结来说,Linux下的简单Socket编程实现C/S架构主要包括服务器的创建、监听、接受连接以及客户端的创建和连接过程。通过编写和运行"server.c"和"client.c",我们可以看到客户端和服务器之间的交互,从而理解Socket...
这是一个典型的C/S(Client/Server)架构的示例,用于演示基本的双向通信功能。 标签中,“server client”很直观地指出了项目的核心组成部分;“planetjk2”可能是开发者或项目团队的标识,具体含义可能需要更多...