为您找到与linux多线程网络编程相关的共200个结果:
现在JAVA作为主流编程语言,如果想要学会java网络编程,需要掌握一定的基础,读文网小编在这里给大家带来java网络编程基础的相关知识,希望能帮到大家。
进行网络通信需要的三要素:ip、端口、协议
UDP:
将数据、源、目的封装成数据包,不需要建立连接
每个数据包限制在64K内
因无连接,是不可靠协议
不需要建立连接,速度快
TCP:
建立连接,形成传输数据的通道
在连接中进行大数据量传输
通过三次握手完成连接,是可靠协议
必须建立连接,是可靠协议
InetAddress类:
基本方法列举
getAddress()返回此 InetAddress 对象的原始 IP 地址。
getHostAddress()返回 IP 地址字符串(以文本表现形式)。
getHostName()获取此 IP 地址的主机名。
getAllByName(String host)在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
getByName(String host)在给定主机名的情况下确定主机的 IP 地址。
getLocalHost()返回本地主机。
isReachable(int timeout)测试是否可以达到该地址。
DatagramPacket类
需求:通过UDP传输协议将一段文字数据发送出去
思路:
1、建立udpSocket服务
2、提供数据并将数据封装到数据包中
3、通过Socket服务的发送功能将数据发送出去
4、关闭资源
面向Socket编程
Socket就是为网络服务提供的一种机制,对应于网络中的传输层,通信的两端都有Socket,网络通信其实就是Socket间的通信,数据在两个Socket间通过IO传输。
无论是UDP的面向连接还是TCP的面向连接,我们面向的其实都是Socket。
Socket中的一些常用方法:
bind(SocketAddress bindpoint)将套接字绑定到本地地址。
connect(SocketAddress endpoint)&connect(SocketAddress endpoint, int timeout)将此套接字连接到服务器,且后者可以指定一个超时值。
getInetAddress()&getPort() 返回套接字连接的远程地址及端口。
getLocalAddress()&getLocalPort()获取套接字绑定的本地地址即端口。
getInputStream()&getOutputStream()返回此套接字的输入输出流。
shutdownInput()&shutdownOutput()禁用此套接字的输入流与输出流,即使同时调用了两方法也不能导致Socket关闭,另外shutdownOutput()方法通常用于告知服务端客户端发送结束。
URL类:
类URL代表一个统一资源定位符,它是指向互联网“资源”的指针。使用该类的openConnection()方法即可获取对应的URLConnection对象,也可以通过openStream()方法直接获取其所指向资源的输入流。
它也提供了一系列的get方法来提取封装在URL对象中的信息
URL中的基本方法:
getFile()获取此 URL 的文件名。
getHost()获取此 URL 的主机名(如果适用)。
getPath()获取此 URL 的路径部分。
getPort()获取此 URL 的端口号。
getProtocol()获取此 URL 的协议名称。
getQuery()获取此 URL 的查询部分。
URLConnection它代表应用程序和 URL之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。
创建一个到URL的连接需要几个步骤:
1、通过在 URL 上调用 openConnection 方法创建连接对象。
2、处理设置参数和一般请求属性。
3、使用 connect 方法建立到远程对象的实际连接。
4、远程对象变为可用,远程对象的头字段和内容变为可访问。
UDP实现发送和接收数据操作
发送端代码实例:
import java.io.*;
import java.net.*;
class UdpSend{
public static void main(String args[]) throws Excption{
DatagramSocket ds = new DatagramSocket();
byte[] buf = "abcde".getByte();
DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddreass.getByName(" 127.0.0.1 "), 10000);
ds.send(dp);
ds.close();
}
}
接收端代码实例:
import java.io.*;
import java.net.*;
class UdpReve{
public static void main(String args[]) throws Excption{
DatagramSocket ds = new DatagramSocket(10000);
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
ds.receive(dp);
String ip = dp.getAddress().getHostAddress();
String data = new String(dp.getDate(), 0, dp.getLength());
int port = dp.getPort();
System.out.println(ip+ "--" +data+ "--" +port);
ds.close();
}
}
https://使用while(true)使接收端持续开启
练习:将本地图片上传到服务器,代码实现:
客户端代码实现:
public class PicClient {
public static void main(String args[]) throws Exception{
Socket s = new Socket("117.84.140.104", 10001);
FileInputStream fis = new FileInputStream("C:\Users\Administrator\Desktop\1.jpg");
OutputStream out = s.getOutputStream();
byte[] buf = new byte[1024];
int ch = 0;
while((ch = fis.read(buf)) != -1){
out.write(buf, 0, ch);
}
s.shutdownOutput();
InputStream in = s.getInputStream();
ch = in.read(buf);
System.out.println(new String(buf, 0, ch));
fis.close();
s.close();
}
}
服务器端代码实现:
public class PicServer {
public static void main(String args[]) throws Exception{
ServerSocket ss = new ServerSocket(10001);
Socket s = ss.accept();
InputStream in = s.getInputStream();
FileOutputStream fis = new FileOutputStream("C:\Users\Administrator\Desktop\2.jpg");
byte[] buf = new byte[1024];
int len = 0;
while((len = in.read(buf)) != -1){
fis.write(buf, 0, len);
}
OutputStream out = s.getOutputStream();
out.write("上传完毕".getBytes());
}
}
浏览量:4
下载量:0
时间:
Unix和Windows同样是由美国的贝尔实验室所开发的独立分时操作系统,它的操作简洁,界面优化好,是编程人员必须熟悉理解的一类操作系统之一。而网络编程是操作系统开发的一项重要内容,尤其是在网络编程中的I/O模型研究是非常重要的一项任务,那么在Unix网络编程中,都有哪些I/O模型呢?读文网小编来告诉你
所谓异步指的就是操作反应方式和顺序有些与众不同,异步模型中,是内核在进行数据拷贝完毕之后才会通知我们完成了相关的操作。配合信号驱动的I/O模型,当内核工作完毕之后就能够发送相关的操作信号,并通知我们进行下一步的操作,这就是异步I/O模型。
浏览量:2
下载量:0
时间:
Kali Linux安装好后,很多人不知道怎么配置网络,本文以校园网的静态IP为例,给大家介绍下Kali Linux的网络配置方法,一起来学习下吧。
kali安装完成之后,首先确定你是DHCP还是静态IP。DHCP是用来给大型网络动态分配IP的协议,而大部分中小型网络(如校园网、家庭网络)都是采用网络管理员手工分配静态IP的方法来确定IP地址的。
Kali Linux的DNS服务器地址使用文件“/etc/resovl.conf”进行配置,用户可以通过“nameserver”配置项设置DNS服务器的 IP地址;“resolv.conf”文件中最多可以使用
“nameserver”指定3个DNS服务器,按照先后的顺序,一旦前面的DNS服务器失效,系统将自动使用后面的DNS服务器。
对于“resolv.conf”文件设置“nameserver”的修改是即时生效的,即只要对“resolv.conf”文件的修改进行了保存,在系统下一次需要进行域名的解析时就会按照该文件中指定
的DNS服务器IP地址进行域名的解析。
在resolv.conf中的格式如下:
domain
nameserver 10.10.10.10
nameserver 102.54.16.2
浏览量:3
下载量:0
时间:
Linux中多线程编程拥有提高应用程序的响应、使多cpu系统更加有效等优点,下面读文网小编将通过Linux下shell多线程编程的例子给大家讲解下多线程编程的过程,一起来了解下吧。
#!/bin/bash
#———————————————————————————–
# 此例子说明了一种用wait、read命令模拟多线程的一种技巧
# 此技巧往往用于多主机检查,比如ssh登录、ping等等这种单进程比较慢而不耗费cpu的情况
# 还说明了多线程的控制
#———————————————————————————–
function a_sub
{
# 此处定义一个函数,作为一个线程(子进程)
sleep 3 # 线程的作用是sleep 3s
}
tmp_fifofile=“/tmp/$.fifo” mkfifo $tmp_fifofile # 新建一个fifo类型的文件
exec 6《》$tmp_fifofile # 将fd6指向fifo类型
rm $tmp_fifofile thread=15 # 此处定义线程数
for
((i=0;i《$thread;i++));do echo
done 》&6 # 事实上就是在fd6中放置了$thread个回车符
for
((i=0;i《50;i++));do # 50次循环,可以理解为50个主机,或其他
read -u6 # 一个read -u6命令执行一次,就从fd6中减去一个回车符,然后向下执行,
# fd6中没有回车符的时候,就停在这了,从而实现了线程数量控制
{ # 此处子进程开始执行,被放到后台
a_sub &&
{ # 此处可以用来判断子进程的逻辑
echo “a_sub is finished”
}
||
{ echo “sub error”
}
echo 》&6 # 当进程结束以后,再向fd6中加上一个回车符,即补上了read -u6减去的那个
}
& done wait # 等待所有的后台子进程结束
exec 6》&- # 关闭df6 exit 0
说明:
此程序中的命令
mkfifo tmpfile
和linux中的命令
mknod tmpfile p
效?果相同。区别是mkfifo为POSIX标准,因此推荐使用它。该命令创建了一个先入先出的管道文件,并为其分配文件标志符6。管道文件是进程之间通信的一种方式,注意这一句很重要
exec 6《》$tmp_fifofile # 将fd6指向fifo类型
如果没有这句,在向文件$tmp_fifofile或者&6写入数据时,程序会被阻塞,直到有read读出了管道文件中的数据为止。而执行了上面这一句后就可以在程序运行期间不断向fifo类型的文件写入数据而不会阻塞,并且数据会被保存下来以供read程序读出。
通过运行命令:
time 。/multithread.sh 》/dev/null
最终运算时间: 50/15 = 3组(每组15)+1组(5个《15 组成一个组)= 4组,每组花费时间:3秒,
则 3 * 4 = 12 秒。
传统非多线程的代码 运算时间: 50 * 3 = 150 秒。
上面就是Linux下shell多线程编程的实例介绍了,使用多线程编程还能够改善程序结构,有兴趣的朋友不妨试试看吧。
浏览量:2
下载量:0
时间:
在重装完Linux系统后,突然发现无法连接网络了,相信遇到这个问题的朋友不少,下面读文网小编就给大家介绍下Linux系统无法连接网络该如何解决。
其实我在上个星期之前,都没有自己装过系统(不过其中有过一次下载了ubuntu12.04来安装,是在win7环境下,忘记当时是直接双击安装还是用虚拟机运行安装,反正就跟装个什么软件或者游戏一样的简单,我觉得这个就不算是真正的装系统),到此刻我也没有自己装过windows系统。
某天我觉得我必须要重装系统了,理由是电脑上莫名其妙的给我装了一个瑞星,然后各种杀毒软件没事就报各种“有病毒,要警惕!”,关键是我没找到瑞星的卸载程序,用360或者金山的那些软件管理之类的工具卸载瑞星,然后它竟然给我弹出个警告,说有恶意程序意图修改它的啥啥啥,然后告诉我已经被它阻止了 - -||| ,大婶们要是看到这里,心想“这个二货白痴咋么这么笨呢,这么个简单的问题都搞不定”,我也就只有深感抱歉啦。。。。。反正最后的结果是,我要重装系统!
由于12年的时候我在win7上如同装应用软件一样的装了个ubuntu12.04,当时用起来感觉非常酷,界面帅啊~ 在终端上写命令安装软件真是一件非常拉风的事啊~ 虽然当时是纯粹耍帅,代价是大半夜的还在google如何安装必须要用的eclipse啊jdk这些,还因为听信谗言整了个啥qq插件的,最终搞得qq好友被一键式全删了(那位同学,笑吧你就,小心你的牙!),不过那时候感觉linux真心很酷,而且我这个垃圾本本用着非常流畅舒服。所以这次重装系统,第一时间就想装ubuntu来玩玩儿。
当我进入ubuntu的官网上时,看到首页推荐的ubuntu kylin,其实我不太喜欢这个名字,但是看到有支持一些国产的常用软件,于是就按照网上找的说明,按照说明制作了U盘安装启动器,然后就顺利的安装好了。然后就开心的看着熟悉的界面风格,觉得自己真是很酷啊~~ 然后的然后就发现无法连接到wifi了。。。。。。。。
当时是稀里糊涂的乱七八糟的在网上找了一通,搞了半天没解决掉,太困了,睡去了,第二天醒来开机,好了 - - ||| 于是我也就开心的使用了。
但是之后发觉,桌面应用真是太卡了!点一下浏览器要等5-10秒,点一下home也要5-10秒,然后加上无时不刻的报“系统错误,提交bug”。。。。。真是让人有摔电脑的冲动。于是google,大家都说是unity的错!但是我又想用ubuntu咋办,然后我就想,肯定是kylin的错,换个版本试试。于是后来我又下了ubuntu12.04,按照说明制作好了U盘安装,然后高高兴兴的装系统,卡在系统安装loading界面了 - - ||| ,本来我是想,肯定是我哪一步弄错了,可是这时候网络卡得很,google都打不开了,正好几天前下了一个linux deepin,于是就想算了,装这个试试,结果一切顺利,安装好了,界面也很漂亮,支持的应用软件也很多,也不那么卡。可是问题是。。。。。。无法连接到wifi.。。。。于是我又拿着手机baidu一通,网上大部分都说是驱动问题,要下载驱动,怎么下载呢?可以直接插上网线,在有线网络环境下安啥啥啥,然后我就找了根网线,插上去,还是连不到网络。于是最后,我就放大胆点,瞎搞乱整!搞定!
正题开始:
首先查看你的网卡型号,在终端输入命令lspci
中你可以看到你的网卡型号,比如我的就是broadcom bcm4313,然后在附加驱动中,看到某个附加驱动的描述
看看你的网卡型号是否包含在其中,并且这个驱动是否是激活状态,如果是,那就移除吧,移除之后,记得要重启(其实当时我也习惯性的等到起弹出个box来提醒我要重启 - -||)。重启之后,如果问题解决了,那么就对了,如果没有解决,那么,请您继续google~
后记:其实我估计大婶们都不会看到这里,我也知道口水实在是太多啦~ 但是我还是想问问,为什么设计者要为这些型号的网卡制作专用驱动呢?通常来说会这样做的,肯定是这些型号的网卡原本连接网络有问题才会需要特别制作专用驱动吧,大概。
上面就是Linux系统无法连接网络的解决方法介绍了,本文介绍的是broadcom网卡无法连接网络的情况,如果是其他网卡的话只能做个参考,具体情况具体分析。
浏览量:3
下载量:0
时间:
OpenMP是一种多处理器多线程的编程语言,能够支持多个平台,包括Linux系统,那么Linux下要如何进行openmp多线程编程呢?一起来和读文网小编了解下吧。
代码如下:
#inlcude 《omp.h》
#pragma omp parallel for
#pragma omp for reduction(+: 变量)
#pragma omp critical//锁
{
}
#pragma omp parallel for private(x,y)//每个线程都独立拷贝x, y变量,互不干扰,如果不设默认是共享变量
#pragma omp parallel for schedule(static/dynamic/guided, k)//总工作量划分成n/k块,再多线程调度
#pragma omp parallel sections
{
#pragma omp section//要保证几个section下的函数之间没有变量依赖
。。。。。。。。。
#pragma omp section
。。。。。。。。。
}
#pragma omp parallel
{
。。。。。。。();
#pragma omp master/single //保证只有主线程/某个线程能访问下面的函数,区别是使用master没有barrier珊障,single的话先完成的线程等待没完成的线程
{
}
。。。。。。。
}《/p》 《p》#pragma omp barrier/nowait //强制设置珊障/无需等待,如果后续函数对前面的多线程没有依赖,即可使用nowait
#pragma omp parallel for firstprivate(变量)/lastprivate(变量) //为每个多线程赋初值/出多线程回到主线程时赋值供主线程使用
还有就是OpenMP的API:
代码如下:
int omp_get_num_threads(); //获取当前使用的线程个数
int omp_get_num_threads(2/3/。。。)//设置要使用的线程个数
nt omp_get_thread_num(void);//返回当前线程号
int omp_get_num_procs(void);//返回可用的处理核个数
ubuntu下,无需加《omp.h》头文件,只需在编译的时候增添-fopenmp即可。
例如:emacs操作命令如下
代码如下:
emacs omp.c《/p》 《p》#include 《stdio.h》
int main()
{
int rank, size;
#pragma omp parallel num_thread(3) private(rank) //num_threads用来控制线程数量
//或者使用omp_set_num_threads(3);《/p》 《p》 {
rank = omp_get_thread_num();
size = omp_get_num_threads();
printf(“using %d of %d now.”, rank, size);
}
return 0;
}《/p》 《p》ctrl+x s
alt+x compile
gcc -fopenmp -o omp omp.c
alt+shift+1 。/omp
上面就是Linux下实现OpenMP多线程编程的方法介绍了,本文主要通过一个实例来给大家讲解OpenMP多线程编程,如果还想了解更多的相关知识,不妨多多关注本站吧。
浏览量:2
下载量:0
时间:
GCC是GNU编译器套件,需在有网络的情况下安装,其安装简单,但无网络能不能安装GCC呢?其实是可以的,下面读文网小编就给大家介绍下Linux无网络安装GCC的技巧,一起来了解下吧。
在有网络的情况下安装gcc只需一条指令:yum install gcc 那么在没有网络的情况下该如何安装gcc呢?虽然没有网络,但需要有安装光盘或者ISO镜像,利用安装光盘或ISO镜像来挂载一个本地yum源,利用这个来安装gcc。
步骤:
1.首先进入文件: vi /etc/yum.repos.d/CentOS-Media.repo
2.修改文件如下:
[c6-media]
name=CentOS-$releasever - Media #名字而已
baseurl=file:///media/Centos #还记得你刚刚挂载镜像的地址不,没错,就是它
gpgcheck=1
enabled=1
gpgkey=file:///etc/media/Centos/RPM-GPG-KEY-CentOS-6 #还是要注意路径
3. 退出保存。
4.输入指令:gcc -v 看看有没有反应。
上面就是Linux无网络安装GCC的技巧介绍了,前提是你要有安装光盘或ISO镜像,否则无法安装,虽然无网络也能安装GCC,但相对来说会复制很多,推荐使用网络安装GCC。
浏览量:2
下载量:0
时间:
今天就有读者问读文网小编我了,Linux网络编程怎么使用多进程实现服务器并发访问?然后读文网小编我通过查阅相关资料后,就把相关的解决方法分享到这里吧,以下就是具体内容:
采用多进程的方式实现服务器的并发访问的经典范例。
viidiot@ubuntu$ ./discli 127.0.0.1
hello,world!(客户端输入的内容)
hello,world!(服务器端返回的内容)
浏览量:3
下载量:0
时间:
由于很多读者都不清楚Linux网络编程socket,那么这里就由读文网小编为大家介绍一下Linux网络编程socket吧:
建立套接字socket()--->与服务器建立连接connect()
详细代码如下:
代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[]) {
int sockfd; char buf[1024];
struct sockaddr_in srvaddr;
struct hostent *phost; int nbytes;
if(argc!=3){
fprintf(stderr,"Usage:%s a",argv[0]);
exit(1);
}
/* 客户程序开始建立 sockfd描述符 */
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){
fprintf(stderr,"socket Error:%sa",strerror(errno));
exit(1);
}
/* 客户程序填充服务端的资料 */
bzero(&srvaddr,sizeof(srvaddr));
srvaddr.sin_family=AF_INET;
srvaddr.sin_port=htons(atoi(argv[2]));
if (inet_pton(AF_INET, argv[1], &srvaddr.sin_addr) <= 0){
fprintf(stderr,"inet_pton Error:%sa",strerror(errno));
exit(1);
}
/* 客户程序发起连接请求 */
if(connect(sockfd,(struct sockaddr *)(&srvaddr),sizeof(struct sockaddr))==-1){
fprintf(stderr,"connect Error:%sa",strerror(errno));
exit(1);
}
/* 连接成功了 */
if((nbytes=read(sockfd,buf,1024))==-1){
fprintf(stderr,"read Error:%s",strerror(errno));
exit(1);
}
buf[nbytes]='