Java网络编程,我们先来看下面这一张图:

由图可得:想要进行网络编程,首先是服务器端通过ServerSocket对某一个端口进行监听。通过accept来判断是否有客户端与其相连。若成功连上,则通过readline和println函数来进行数据的发送和接收。实现网络编程。

示例如下:

服务器端代码:

/*
* 功能:演示Java网络编程的服务器端
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestServer { InputStreamReader isr;
BufferedReader br;
PrintWriter pw; public static void main(String[] args) {
TestServer ts=new TestServer(); }
public TestServer()
{ try {
//监听某个端口
ServerSocket ss=new ServerSocket(9999);
System.out.println("我是socket服务器正在监听9999端口.........");
//等待某个客户端来连接,accept()函数将返回一个socket连接
Socket s=ss.accept(); //要读取s中传递的数据
isr =new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
//通过readline()函数来读写数据
String info=br.readLine();
System.out.println("服务器收到的消息为:"+info); //我们通过pw向s写数据,true表示即时刷新
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你也好,我是服务器!!!");
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

客户端代码:

/*
* 功能:这是一个客户端,可以连接服务器端
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestClient { InputStreamReader isr;
BufferedReader br;
PrintWriter pw; public static void main(String[] args) {
TestClient tc=new TestClient();
} public TestClient()
{
try {
//socket()函数就是去连接某个服务器,ip+端口
Socket s=new Socket("127.0.0.1",9999); //如果s连接成功,就可以发送数据到服务器端
//我们通过pw向s写数据,true表示即时刷新
pw=new PrintWriter(s.getOutputStream(),true);
pw.println("你好,我是客户端!!!"); //读取s中传递的数据
isr =new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
/ /通过readline()函数来读写数据
String info=br.readLine();
System.out.println("客户端收到的消息为:"+info); } catch (IOException e) { e.printStackTrace();
}finally{
try {
if(pw!=null)
pw.close();
if(br!=null)
br.close();
if(isr!=null)
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
} }
}

发送数据时用到了PrintlnWriter对象,标准形式为:

PrintWriter pw=new PrintWriter(s.getOutputStream(),true)

其中true参数表示即时刷新。

通过InputStreamReader以及readline函数来实现数据的读取。

下边是一个半双工的示例:

服务器端代码:

/*
* 功能:演示从控制台进行对话
* author:ywq
*/
import java.net.*;
import java.io.*;
public class TestServer { InputStreamReader isr,isr2;
BufferedReader br,br2;
PrintWriter pw;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestServer ts=new TestServer();
} public TestServer()
{
try {
ServerSocket ss=new ServerSocket(3002);
System.out.println("服务器在监听3002端口...");
//判断是否有客户端连接
Socket s=ss.accept();
//读取来自客户端的消息
isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr); pw=new PrintWriter(s.getOutputStream(),true);
//接收从控制台输入的信息
isr2=new InputStreamReader(System.in);
br2=new BufferedReader(isr2); while(true)
{ String respone=br.readLine();
if(respone.equals("再见"))
{
System.out.println("对话结束");
s.close();
break;
}
System.out.println("客户端说:"+respone); System.out.println("请输入要发送到客户端的信息:");
String info=br2.readLine();
//将消息发送给客户端
pw.println(info);
if(info.equals("再见"))
{
System.out.println("对话结束");
s.close();
break;
} } } catch (IOException e) { e.printStackTrace();
}finally
{
if(br2!=null)
try {
br2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr2!=null)
try {
isr2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(pw!=null)
pw.close();
if(br!=null)
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr!=null)
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
}

客户端代码如下:

/*
* 功能:这是一个客户端,实现从控制台输入数据
* author:ywq
*/
import java.io.*;
import java.net.*;
public class TestClient { InputStreamReader isr,isr2;
BufferedReader br,br2;
PrintWriter pw;
public static void main(String[] args) {
// TODO Auto-generated method stub
TestClient tc=new TestClient();
} public TestClient()
{
try {
Socket s=new Socket("127.0.0.1",3002);
pw=new PrintWriter(s.getOutputStream(),true);
//从控制台接收消息
isr=new InputStreamReader(System.in);
br=new BufferedReader(isr); //从服务器接收信息
isr2=new InputStreamReader(s.getInputStream());
br2=new BufferedReader(isr2); while(true)
{
System.out.println("请说出你想对服务器说的话,按回车键结束");
//得到从控制台输入的消息
String resp=br.readLine();
//将数据发送给服务器
pw.println(resp);
if(resp.equals("再见"))
{
System.out.println("客户端使对话结束");
s.close();
break;
} String respo=br2.readLine();
if(respo.equals("再见"))
{
System.out.println("服务器使对话结束");
s.close();
break;
} System.out.println("服务器说:"+respo); } } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally
{
if(br2!=null)
try {
br2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr2!=null)
try {
isr2.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(pw!=null)
pw.close();
if(br!=null)
try {
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isr!=null)
try {
isr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } } }

自此,学到了基本的Java网络编程知识,有待进一步拓展。


进一步学习:

下面看一个简易对讲机的实现:

服务器端代码:

/*
* 功能:这是一个服务器,实现简易的对讲机,带界面
* author:ywq
*/
import javax.swing.*; import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*; public class TestServer3 extends JFrame implements ActionListener{ //定义组件
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null; InputStreamReader isr=null;
BufferedReader br=null;
PrintWriter pw=null; public static void main(String[] args) {
// TODO Auto-generated method stub
TestServer3 ts=new TestServer3();
} public TestServer3()
{
//创建组件
jta=new JTextArea();
jtf=new JTextField(10);
jb=new JButton("发送");
//设置监听
jb.addActionListener(this); jsp=new JScrollPane(jta); jp=new JPanel();
jp.add(jtf);
jp.add(jb); this.add(jp,"South");
this.add(jsp,"Center"); this.setSize(300, 300);
this.setVisible(true);
this.setTitle("简易QQ聊天--服务器");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //建立socket连接
try {
ServerSocket ss=new ServerSocket(1234);
Socket s=ss.accept(); isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true);
//做一个循环
while(true)
{
//在循环中读取来自客户端的消息并且显示
String info=br.readLine();
jta.append("客户端说: "+info+"\r\n"); } } catch (IOException e) { e.printStackTrace();
} } @Override
public void actionPerformed(ActionEvent e) {
//进行相应的操作
if(e.getSource()==jb)
{
//点击发送按钮后,将消息发送出去
String resp=jtf.getText();
jta.append("你对客户端说: "+resp+"\r\n");
pw.println(resp);
jtf.setText(" ");
} }
}

客户端如下:

/*
* 功能:这是一个客户端。可以实现简易对讲机
* author:ywq
*/ import javax.swing.*; import java.net.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;  public class TestClient3 extends JFrame implements ActionListener{ //定义组件
JTextArea jta=null;
JTextField jtf=null;
JButton jb=null;
JPanel jp=null;
JScrollPane jsp=null; InputStreamReader isr=null;
BufferedReader br=null;
PrintWriter pw=null; public static void main(String[] args) {
// TODO Auto-generated method stub
TestClient3 tc=new TestClient3();
} public TestClient3()
{
//创建组件
jta=new JTextArea();
jtf=new JTextField(10);
jb=new JButton("发送");
//设置监听
jb.addActionListener(this); jsp=new JScrollPane(jta); jp=new JPanel();
jp.add(jtf);
jp.add(jb); this.add(jp,"South");
this.add(jsp,"Center"); this.setSize(300, 300);
this.setVisible(true);
this.setTitle("简易QQ聊天--客户端");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //建立socket连接
try {
Socket s=new Socket("127.0.0.1",1234); isr=new InputStreamReader(s.getInputStream());
br=new BufferedReader(isr);
pw=new PrintWriter(s.getOutputStream(),true); while(true)
{
//在循环中读取来自服务器的消息,并且显示
 String info=br.readLine();
jta.append("服务器说: "+info+"\r\n"); } } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} } @Override
public void actionPerformed(ActionEvent e) {
//点击发送按钮后,将消息发送出去
if(e.getSource()==jb)
{
String resp=jtf.getText();
jta.append("你对服务器说: "+resp+"\r\n");
pw.println(resp);
//清空
jtf.setText(" ");
}
} }

代码执行过程截图如下:

由截图可以看出:本实例较好的实现了聊天功能。但是距离真的模拟QQ聊天技术还差很多。有待进一步改进。

Java网络编程学习笔记的更多相关文章

  1. java网络编程学习笔记(一)

    1.进程之间的通信 进程是指运行中的程序,进程的任务就是执行程序中的代码. 存在计算机网络上的两个进程只需要关注它们通信的具体内容,而不需关注消息在网络上传输的具体细节. 2.计算机网络的概念 Int ...

  2. java 网络编程学习笔记

    1.IP地址 IP地址组成:网络号段+主机号段 IP地址分类: A类:第一号段为网络号段+后三段的主机号段 1.0.0.1---127.255.255.254(10.x.x.x是私有地址) 一个网络号 ...

  3. java网络编程学习笔记(四):线程池的实现

    package QQ; import java.util.LinkedList; /** * Created by hu on 2015/11/9. */ public class ThreadPoo ...

  4. java网络编程学习笔记(二):socket详解

    1.Socket有多种构造方法,大多数构造方法在构造的时候就指定了连接的主机和端口号.当客户端的构造方法与服务器连接的时候,可能需要等待一段时间,因为需要建立连接.默认情况下,Socket的构造方法会 ...

  5. java网络编程学习笔记(三):ServerSocket详解

    1.ServerSocket的构造方法 ServerSocket(); ServerSocket(int port); ServerSocket(int port,int backlog); Serv ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. 转 网络编程学习笔记一:Socket编程

    题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公司使用的一些控件的开发,浏览器兼容性搞死人:但主要是因为这段时间一直在看html5的东西,看到web socket时觉得很有 ...

  8. JAVA TCP网络编程学习笔记

    一.JAVA网络编程概述 网络应用程序,就是在已实现网络互联的不同计算机上运行的应用程序,这些程序之间可以相互交换数据.JAVA是优秀的网络编程语言,Java网络编程的类库位于java.net包中.J ...

  9. Java 网络编程学习总结

    新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1]    网络编程认识                [2]  TCP/IP编程 ...

随机推荐

  1. 一步一步学Silverlight 2系列(16):数据与通信之JSON

    概述 Silverlight 2 Beta 1版本发布了,无论从Runtime还是Tools都给我们带来了很多的惊喜,如支持框架语言Visual Basic, Visual C#, IronRuby, ...

  2. [Java] 读取文件

    1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如 ...

  3. [Selenium] Grid 介绍

    Selenium Grid 支持分布式测试,使测试人员可在分布式环境中进行测试 一般而言,在面临以下情况时可考虑使用Selenium Grid : 1.测试多个浏览器或单个浏览器多个版本,或测试不同操 ...

  4. Android适合组件化开发的路由框架:Launch

    1.概述 最近越来越不想写代码了,特别是一些重复性的代码,比如由于每次启动一个 Activity,我们都会很习惯的在 Activity 中写下: public static void launch(A ...

  5. 1. jsp中<base target='' />标签用法

    用于页面跳转后,页面最后跳转到哪个iframe.例子如下: index.jsp :首页 <head> <base href="<%=basePath %>&qu ...

  6. 6-9 Haar+adaboost人脸识别

    我们重点分析了Haar特征的概念以及如何计算Haar特征,并介绍了Haar+Adaboost分类器它们的组合以及Adaboost分类器如何使用和训练.这节课我们将通过代码来实现一下Haar+Adabo ...

  7. 【Codeforces自我陶醉水题篇~】(差17C code....)

    Codeforces17A 题意: 有一种素数会等于两个相邻的素数相加 如果在2~n的范围内有至少k个这样的素数,就YES,否则就NO; 思路: 采用直接打表,后面判断一下就好了.那个预处理素数表还是 ...

  8. 黑客攻防技术宝典web实战篇:攻击本地编译型应用程序习题

    猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 如果不采用特殊的防御措施,为什么栈缓冲区溢出比堆溢出更容易被攻击者利用? 利用基于栈的溢出 ...

  9. 利用pyinstaller生成exe文件碰到的一些问题及解决方法

    在“开源图像标注工具labelme的安装使用及汉化”这篇博客中,使用pyinstaller将labelme项目的入口python文件main.py打包,生成了main.exe文件,可以在Windows ...

  10. LuoguP2700逐个击破【并查集/生成树/正难则反】By cellur925

    题目传送门 题目大意:给你一棵树,求把其中k个点相互隔离(不连通)所需要的边权代价. 这题我开始是想要求出把k个点联通的最小代价的,但后来发现还是实现起来比较困难,题解里貌似也没有这种做法,于是就鸽了 ...